命令模式-适配器模式-外观模式-模板方法模式-迭代器模式-组合模式-状态模式-代理模式

命令模式:把一系列的操作封装成一个命令

代码:

 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也能算),可以把各种迭代器组合起来使用。

状态模式:模拟有限状态机,写一个状态接口,所有具体实现(状态)都实现这个接口。同时让每一个状态都能够根据状态和操作确认下一步行动。

代理模式:如果真正的对象在网络的另外一端,可以写一个代理类让当前程序以为是在调用这个类,其实是这个类把相关信息发给网络上的另外一端。

 

posted @ 2016-08-19 10:34  DavieTiming  阅读(435)  评论(0编辑  收藏  举报