文档章节

设计模式(3)

jit-hakase
 jit-hakase
发布于 2017/08/25 14:15
字数 845
阅读 1
收藏 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();
	}
}

© 著作权归作者所有

上一篇: 设计模式(4)
下一篇: 设计模式(2)
jit-hakase
粉丝 1
博文 26
码字总数 30408
作品 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
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
【设计模式笔记】(十六)- 代理模式

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

MrTrying
2018/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IntelliJ IDEA创建第一个Spring boot项目

下载maven:http://maven.apache.org/download.cgi 开发工具:IntelliJ IDEA JDK: Java JDK1.8 ## 1.为了第一个项目初始化速度加快,我们先来配置maven: 添加配置: 选择Build,Execution,Dep...

凌宇之蓝
47分钟前
2
0
Coding and Paper Letter(四十五)

资源整理。 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型。 它还支持随机建模以解决参数和模型的不确定...

胖胖雕
今天
6
0
golang 声明一个指定长度的数组,用于后续添加

很多时候我们需要声明一个指定长度的数组,用于后续添加.在使用go的时候要注意,下面的第一个例子会有报错 "non-constant array bound",应该使用第二个例子. Length 是动态的值 有报错的例子 ...

漫步海边小路
今天
0
0
Java NIO示例

Server端 /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */package book.chapter1.tcpnio;import java.net.InetSocketAddress;i...

月下狼
今天
1
0
发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部