文档章节

设计模式(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
粉丝 0
博文 26
码字总数 30408
作品 0
南京
程序员
私信 提问
《PHP设计模式大全》系列分享专栏

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

kaixin_code
11/06
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
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
java设计模式-- 单例模式

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

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

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

Carson_Ho
04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript实现在线Markdown编辑器、转换HTML工具-toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
18分钟前
0
0
Source Tree 在git 密码更新后,无法拉取代码的解决办法

背景: git 密码总是需要修改。在修改代码后,拉去代码, source tree 总提示access denied. 解决方法:重新修改git 仓库对应的密码。 for mac:应用程序 -》 钥匙串 -》 搜索 source tre...

Carlyle_Lee
22分钟前
0
0
OSChina 周日乱弹 —— 懒床是对冬天最起码的尊重

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享daniwellP/桃音モモ的单曲《Nyan Cat》 《Nyan Cat》- daniwellP/桃音モモ 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪...

小小编辑
今天
67
2
码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
4
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部