命令模式:把一系列的操作封装成一个命令
代码:
1 import java.util.LinkedList; 2 import java.util.Queue; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 Queue<command> cmdQueue = new LinkedList<command>(); 8 cmdQueue.offer(new GoToStore()); 9 cmdQueue.offer(new BuyFood()); 10 cmdQueue.offer(new EatFood()); 11 while (!cmdQueue.isEmpty()) { 12 cmdQueue.poll().execute(); 13 } 14 } 15 } 16 17 18 interface command { 19 public void execute(); 20 } 21 22 23 class GoToStore implements command { 24 25 @Override 26 public void execute() { 27 System.out.println("Go to store"); 28 } 29 30 } 31 32 33 class BuyFood implements command { 34 35 @Override 36 public void execute() { 37 System.out.println("Buy some food"); 38 } 39 40 } 41 42 43 class EatFood implements command { 44 45 @Override 46 public void execute() { 47 System.out.println("Eat food"); 48 } 49 50 }
可以用于命令的队列,也可以用于日志请求(比如自动记录每一步的操作,方便撤销或者日后重复)。
设计思想:用一个接口封装算法实现,最后向上转型对各种不同的算法实现一视同仁(都调用execute方法)。
适配器模式:
不需要代码了,一句话就是两个接口不兼容,写一个适配器去兼容。比如一边给你个数组告诉你把他们打印出来,另外一边打印方法的参数是一个ArrayList,你就写个接口进行转换。这种思想到处其实都有用到,只是具体用到的时候情况可大可小。
外观模式:
定义一个接口为一系列复杂调用的外部接口,屏蔽其内部复杂的调用过程。很多地方也有用到,比如Executors工具类,就屏蔽了构造阻塞队列等等过程。(当然从设计模式上来说这个地方还用到了很多别的设计模式)
模板方法模式:
一个非常有用的模式,也是大量使用。
代码:
1 public class Main { 2 3 public static void main(String[] args) { 4 MakeTheDinner tom = new TomMakeDinner(); 5 tom.make(); 6 MakeTheDinner jack = new JackMakeDinner(); 7 jack.make(); 8 } 9 } 10 11 12 abstract class MakeTheDinner { 13 14 public final void make() { 15 buySomeMaterial(); 16 cleanTheTable(); 17 makeDishes(); 18 } 19 20 private void buySomeMaterial() { 21 System.out.println("Buy some material"); 22 } 23 24 private void cleanTheTable() { 25 System.out.println("Clean the table"); 26 } 27 28 protected abstract void makeDishes(); // 具体的做菜 29 } 30 31 32 class TomMakeDinner extends MakeTheDinner { 33 34 @Override 35 protected void makeDishes() { 36 System.out.println("Make seafood"); 37 } 38 39 } 40 41 42 class JackMakeDinner extends MakeTheDinner { 43 44 @Override 45 protected void makeDishes() { 46 System.out.println("Make rice"); 47 } 48 49 }
思想:把一个算法的部分实现通过虚方法的方式交给子类,但是别的都放在一个final方法里面,可以做到该相同的代码都相同(final中的非虚代码),该不同的代码都不同(final中的虚方法)。
这个世界模式的意义在很久之后我才更加清楚。我目前能领悟的有两点,首先是封装可重用的代码。其次是组织代码结构,让父类做统一的流程控制,而让子类区分不同。然后是代码的复用性提升,几年前的代码依然可以简单使用。
迭代器模式:用迭代器屏蔽底层容器类的不同实现不同遍历方式,让外部可以通过相同的方式来遍历。
组合模式:当一个类里面有多重数据结构时(HashMap也能算),可以把各种迭代器组合起来使用。
状态模式:模拟有限状态机,写一个状态接口,所有具体实现(状态)都实现这个接口。同时让每一个状态都能够根据状态和操作确认下一步行动。
代理模式:如果真正的对象在网络的另外一端,可以写一个代理类让当前程序以为是在调用这个类,其实是这个类把相关信息发给网络上的另外一端。