zoukankan      html  css  js  c++  java
  • java设计模式8.迭代子模式、责任链模式、命令模式

    • 迭代子模式

    迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。它将迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分开。迭代子对象是对遍历的抽象化,不同的聚集对象可以提供相同的迭代子对象,从而使客户端无需知道聚集的底层结构。一个聚集可以提供多个不同的迭代子对象,从而使得遍历逻辑的变化不会影响到聚集对象本身

    • 示例:java集合类

    Collection接口定义了iterator接口返回一个Iterator对象,在具体实现类ArrayList中返回一个私有的内部Iterator子类对象。这里简单画一下常用的集合api类的关系图,后面有时间再专门整理下java集合。java集合分两部分。

    Collection:

    Map:

    • 责任链模式

    在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在影响客户端的情况下动态地重新组织链和分配责任

    • 抽象处理者:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。
    • 具体处理者:具体处理者接到请求后,可以选择将请求处理掉,或者传给下家。
    • 命令模式

    命令模式是对命令的封装,把发出命令的责任和执行命令的责任分割开,委派给不同的对象(命令对象确定具体由哪接收者怎样执行,请求者确定怎样发出哪个命令)。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行,何时执行以及怎么执行。

    • 客户角色Client:创建一个具体命令对象并确定其接收者。
    • 命令角色Command:声明一个给所有具体命令类的抽象接口。
    • 具体命令角色ConcreteCommand:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。
    • 请求者角色Invoker:负责调用命令对象执行请求。
    • 接收者角色Receiver:负责具体实施和执行一个请求,任何一个类都可以成为接收者。
    public class Client {
        
        public static void main(String[] args) {
            Receiver receiver = new Receiver();
            Command command = new ConcreteCommand(receiver);
            Invoker invoker = new Invoker(command);
            invoker.action();
        }
    }
    // Invoker的构造接收Command参数,并提供一个action()方法作为行动方法
    public class Invoker {
        
        private Command command;
        
        public Invoker(Command command){
            this.command = command;
        }
     
        public void action(){
            command.execute();
        }
    }
    // Receiver是命令的接收者,在命令的控制下执行action()
    public class Receiver {
     
        public Receiver(){
            
        }
        
        public void action(){
            System.out.println("action"); 
        }
    }
    public interface Command {
     
        void execute();
    }
    public class ConcreteCommand  implements Command {
     
        public Receiver receiver;
        
        public ConcreteCommand(Receiver receiver){
            this.receiver = receiver;
        }
        
        @Override
        public void execute() {
            receiver.action();
        }
    }

    #笔记内容参考《java与模式》

  • 相关阅读:
    bzoj 4066: 简单题 K-D树
    SAS获取最后一条观测到指定宏
    sas 获取字符串长度实例
    tomcat Error:NB:JAVA_HOME should point to a JDK not a JRE 解决方法
    ODBC数据源管理器-》系统DSN-》没有....Microsoft Access Driver(*mdb,*,accdb)
    SAS DATA ENCODING 解决odbc乱码问题
    sas 日期比较代码备忘
    sas transpose 代码备忘
    svn 红叉叉图标解决方法
    echart line 初始化隐藏legend
  • 原文地址:https://www.cnblogs.com/shanhm1991/p/9898663.html
Copyright © 2011-2022 走看看