文档章节

设计模式(3)

jit-hakase
 jit-hakase
发布于 2017/08/25 14:15
字数 845
阅读 1
收藏 0
点赞 0
评论 0

设计模式

行为型模式

解释器模式

Context是一个上下文环境类, PlusMinus分别是用来计算的实现. 解释器模式可以用在复杂的计算方式, 适合于开发编译器和解释器.

interface Expression {
	int interpret(Context context);  
}

class Context {
	
	private int numOne, numTwo;
	
	public Context(int numOne, int numTwo) {
		this.numOne = numOne;
		this.numTwo = numTwo;
	}
	
	public int getNumOne() { return numOne; }
	public void setNumOne(int numOne) { this.numOne = numOne; }
	public int getNumTwo() { return numTwo; }
	public void setNumTwo(int numTwo) { this.numTwo = numTwo; }
}

class Minus implements Expression {
	@Override
	public int interpret(Context context) {
		return context.getNumOne() - context.getNumTwo();
	}
}

class Plus implements Expression {
	@Override
	public int interpret(Context context) {
		return context.getNumOne() + context.getNumTwo();
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Context context = new Context(10, 5);
		
		int result = new Plus().interpret(
				new Context(new Minus().interpret(context), 
						new Plus().interpret(context)));
		
		System.out.println(result);
	}
}

命令模式

将调用者, 接收者, 命令三者互相解除类间的耦合度.

interface Command {
	void exec();
}

interface Receiver {
	void startup();
	void shutdown();
}

class MySQLReceiver implements Receiver {
	@Override
	public void startup() {
		System.out.println("MySQL startup...");
	}
	@Override
	public void shutdown() {
		System.out.println("MySQL shutdown...");
	}
}

class OracleReceiver implements Receiver {
	@Override
	public void startup() {
		System.out.println("Oracle startup...");
	}
	@Override
	public void shutdown() {
		System.out.println("Oracle shutdown...");
	}
}

class CommandStartup implements Command {
	
	private Receiver receiver;
	
	public CommandStartup(Receiver receiver) {
		this.receiver = receiver;
	}
	@Override
	public void exec() {
		receiver.startup();
	}
}

class CommandShutdown implements Command {
	
	private Receiver receiver;
	
	public CommandShutdown(Receiver receiver) {
		this.receiver = receiver;
	}
	@Override
	public void exec() {
		receiver.shutdown();
	}
}

class Invoker {
	private Command command;
	
	public void setCommand(Command command) {
		this.command = command;
	}
	
	public void invoke() {
		command.exec();
	}
}

public class Main {
	
	public static void main(String[] args) {

		Receiver receiver = new MySQLReceiver();
		Command cmdStartup = new CommandStartup(receiver);
		Command cmdShutdown = new CommandShutdown(receiver);
		
		Invoker invoker = new Invoker();
		invoker.setCommand(cmdStartup);
		invoker.invoke();
		
		invoker.setCommand(cmdShutdown);
		invoker.invoke();
	}
}

迭代器模式

java集合类中使用的模式, 即使用迭代器对象来迭代容器对象.

import java.util.ArrayList;
import java.util.List;

interface Fruit {
	String getName();
}

class Apple implements Fruit {
	@Override
	public String getName() {
		return "apple";
	}
}

class Banana implements Fruit {
	@Override
	public String getName() {
		return "banana";
	}
}

class FruitColletion {
	
	private List<Fruit> fruitList = new ArrayList<>();
	
	public FruitIterator iterator() {
		return new FruitIterator(this);
	}
	
	public void add(Fruit fruit) {
		fruitList.add(fruit);
	}
	
	public void remove(Fruit fruit) {
		fruitList.remove(fruit);
	}
	
	public List<Fruit> getList() {
		return fruitList;
	}
}

class FruitIterator {
	
	private List<Fruit> fruitList;
	private int pos;
	
	public FruitIterator(FruitColletion collection) {
		fruitList = collection.getList();
	}

	public Fruit prev() {
		if (pos > 0) {
			--pos;
			return fruitList.get(pos);
		}
		return null;
	}

	public Fruit next() {
		if (pos < fruitList.size()-1) {
			++pos;
			return fruitList.get(pos);
		}
		return null;
	}

	public Fruit first() {
		pos = 0;
		return fruitList.get(pos);
	}

	public boolean hasNext() {
		if (pos >= fruitList.size()-1) {
			return false;
		}
		return true;
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Fruit appleOne = new Apple();
		Fruit bananaOne = new Banana();
		Fruit appleTwo = new Apple();
		Fruit bananaTwo = new Banana();
		
		FruitColletion collection = new FruitColletion();
		collection.add(appleOne);
		collection.add(bananaOne);
		collection.add(bananaTwo);
		collection.add(appleTwo);
		
		FruitIterator iter = collection.iterator();
		Fruit firstFruit = iter.first();
		System.out.println(firstFruit.getName());
		
		while (iter.hasNext()) {
			Fruit fruit = iter.next();
			System.out.println(fruit.getName());
		}
	}
}

备忘录模式

备份状态 - 恢复状态, 常用于保存游戏, 加载存档等.

import java.util.ArrayList;
import java.util.List;

class Computer {
	
	private String stat = "shutdown";
	
	public Computer(String stat) {
		this.stat = stat;
	}
	
	public Memento createMemento() {
		return new Memento(stat);
	}
	
	public void restoreMemento(Memento memento) {
		this.stat = memento.getStat();
	}
	
	public String getStat() { return stat; }
	public void setStat(String stat) { this.stat = stat; }
}

class Memento {
	
	private String stat;
	
	public Memento(String stat) {
		this.stat = stat;
	}

	public String getStat() { return stat; }
}

class Storage {
	
	private List<Memento> mementos = new ArrayList<>();
	
	public void addMemento(Memento memento) {
		mementos.add(memento);
	}
	
	public void removeMemento(Memento memento) {
		mementos.remove(memento);
	}
	
	public Memento getMemento(int history) {
		
		if (history >= 0 || history < -mementos.size()+1) {
			history = 0;
		}
		int pos = mementos.size()-1 + history;
		
		return mementos.get(pos);
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		Computer computer = new Computer("startup");
		Memento mementoStartup = computer.createMemento();
		computer.setStat("running");
		Memento mementoRunning = computer.createMemento();
		computer.setStat("shutdown");
		Memento mementoShutdown = computer.createMemento();
		
		Storage storage = new Storage();
		storage.addMemento(mementoStartup);
		storage.addMemento(mementoRunning);
		storage.addMemento(mementoShutdown);
		
		computer.restoreMemento(storage.getMemento(0));
		System.out.println(computer.getStat());
		computer.restoreMemento(storage.getMemento(-1));
		System.out.println(computer.getStat());
		computer.restoreMemento(storage.getMemento(-2));
		System.out.println(computer.getStat());
		computer.restoreMemento(storage.getMemento(-3));
		System.out.println(computer.getStat());
	}
}

状态模式

当对象的状态改变时, 同时改变其行为.

class State {
	
	private String name;
	
	public State(String name) {
		this.name = name;
	}
	
	public void open() {
		System.out.println("open...");
	}
	public void running() {
		System.out.println("running...");
	}
	public void close() {
		System.out.println("close...");
	}
	
	public String getName() { return name; }
	public void setName(String name) { this.name = name; }
}

class Context {
	private State stat = new State("close");
	
	public void exec() {
		
		String statName = stat.getName();
		
		if (statName.equals("close")) {
			stat.setName("open");
			stat.open();
		} else if (statName.equals("open")) {
			stat.setName("running");
			stat.running();
		} else if (statName.equals("running")) {
			stat.setName("close");
			stat.close();
		}
	}

	public State getStat() { return stat; }
	public void setStat(State stat) { this.stat = stat; }
}

public class Main {
	
	public static void main(String[] args) {
		
		Context context = new Context();
		context.exec();
		context.exec();
		
		context.setStat(new State("close"));
		context.exec();
	}
}

© 著作权归作者所有

jit-hakase
粉丝 0
博文 26
码字总数 30408
作品 0
南京
程序员
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
04/09
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127
2017/11/12
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
0
0
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 配置 HTTP 超时设置

当宏,例如 RSS Macro 进行 HTTP 请求的时候,有可能因为请求的时间比较长,而导致超时。你可以通过设置系统参数来避免这个问题。 配置 HTTP 超时设置: 在屏幕的右上角单击 控制台按钮 ,然...

honeymose
11分钟前
0
0
我的第一篇博文

网络界的前辈们好。本人从接触网络到你现在也有4、5年的时间了,期间不断的通过网络学习,当然也没少看大牛们给的建议。 2011年的9月份,如愿以偿的上了“大学”,刚上大学就接触到了一门叫做...

yeahlife
25分钟前
0
0
第十四章NFS服务搭建与配置

14.1 NFS介绍 NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netap...

Linux学习笔记
31分钟前
0
0
双向认证-nginx

1、设置容器 docker run -it --name nginx-test2 -v /home/nginx:/apps -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 8183:80 -p 7443:443 -d nginx:stable 2、修改nginx配......

hotsmile
31分钟前
0
0
深入了解 Java 自动内存管理机制及性能优化

一图带你看完本文 一、运行时数据区域 首先来看看Java虚拟机所管理的内存包括哪些区域,就像我们要了解一个房子,我们得先知道这个房子大体构造。根据《Java虚拟机规范(Java SE 7 版)》的规...

Java大蜗牛
33分钟前
4
0
SpringBoot | 第六章:常用注解介绍及简单使用

前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志 配置等。这章节开始,开始总结一些关于springboot的综合开发的知识点。由于SpringBoot本身是基于Spring和SpringMvc...

oKong
34分钟前
7
0
云数据库架构演进与实践

如今,大型企业如金融企业和银行等,在下一代的微服务架构转型要求下,需要基础软件和数据平台能够实现原生的云化,以满足微服务架构的需求。 微服务,也就是一种面向服务的,有特定边界的松...

巨杉数据库
35分钟前
0
0
Linux系统梳理---系统搭建(一):jdk卸载与安装

1.去官网下载符合Linux版本的jdk,暂用jdk-8u171-linux-x64.rpm 2.登陆Linux,进入usr目录,创建java目录(方便管理,可以其他位置):mkdir java 3.上传下载的jdk包至Linux服务器,使用rz指令(sz f...

勤奋的蚂蚁
46分钟前
0
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

六库科技
48分钟前
0
0
JVM 堆内存设置 -Xmx -Xms

在Tomcat的启动参数里可以设置,如下 参数说明: -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xmx 此设置控制 Java 堆的最大大...

不开心的时候不要学习
50分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部