zoukankan      html  css  js  c++  java
  • 命令模式-适配器模式-外观模式-模板方法模式-迭代器模式-组合模式-状态模式-代理模式

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

    代码:

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

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

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

  • 相关阅读:
    forEach方法的实现
    经典笔试题
    Js中的filter()方法
    arguments参数对象
    随机验证码实现
    DB2 字符串比较
    博客园那篇文章,怎么被“注入”的?
    DB2存储过程创建临时表,返回临时表集合
    Struts的一些关键词
    DB2使用笔记生成存储过程ID
  • 原文地址:https://www.cnblogs.com/dsj2016/p/5786672.html
Copyright © 2011-2022 走看看