一、理解

(1)责任链:将处理用户请求的多个对象构成一条链,对用户而言只需将请求交给这条链就行,可用降低请求的发送者和接收者之间的耦合关系。

(2)命令:将请求封装成对象,用户使用请求对象就能完成求情操作,请求对象里有求情接收者的引用,即对用户而言请求接收者不可见。

(3)解释器:给定一个语言,定义它文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

(4)迭代器:提供一种访问聚合对象中的各元素的方法,即对一个类中聚合着大量对象而言,写一个类单独来实现对这些聚合对象的访问。

(5)中介者:交互的对象不直接交互,通过中介者交互来实现间接交互,每个交互对象都只知道自己的中介者,中介者则知道交互双方对象,并决定将收到的信息传递给谁。

二、代码理解

(1)责任链

比如一个表单验证,假设验证顺序为,用户名、密码、验证码

定义一个处理求情的接口

public interface handler {
       handler next;
       void handlerRequest(); 
}

定义具体的验证用户名类

public authName implements handler {

      public authName(handler next){
            super.next=next;
      }
      void handlerRequest(form f) {
             if(f.name.equals()=="lusong") {
                   if(super.next!=null){
                      super.next.handlerRequest(f);
                   }
             }
             else{
                  System.out.println("用户名错误");
            }
     }
} 

定义验证密码类

public authPasswd implements handler {

      public authName(handler next){
            super.next=next;
      }
      void handlerRequest(form f) {
             if(f.passwd.equals()=="123456") {
                   if(super.next!=null){
                      super.next.handlerRequest(f);
                   }
             else{
                  System.out.println("密码错误");
            }
     }
} 

定义验证 验证码类

public authAuthcode implements handler {

      public authName(handler next){
            super.next=next;
      }
      void handlerRequest(form f) {
             if(f.authCode.equals()=="ABCD") {
                   if(super.next!=null){
                      super.next.handlerRequest(f);
                   }                   
             }
             else{
                  System.out.println("验证码错误");
            }
     }
} 

测试代码

public calss test {
      public static void main(String[] sgrc) {
              //假设有一表单 f
                                 //将验证功能的每个对象构成一条链
             bandler authAuthcode = new authAuthcode(null);
             bandler authPasswd = new authPasswd(authauthcode);
             bandler authName = new authName(authPasswd);
             form f =new form("lusong","123456","ABC");   //假设有表单类
             authName(f) 
      }

}

(2)命令

将命令封装成对象,对用户而言只需要使用命令对象就能和信息接收者进行交互。

例如,小明想打开电视,使用遥控器就能打开电视,

定义电视类

public class TV {
     void openTV() {
         System.out.println("电视打开");
     }
}

定义抽象命令接口

public abstract calss command {
      TV tv;
      execute();
}

定义打开电视具体命令

public class openTV  extends {
     public openTV() {
        super.tv=new TV();
     }
     excute() {
          tv.openTV();
     }
}

定义调用者

public class invoker {
        String name;
        command c;
        public invoker(String name,command c) {
              this.name=name;
               this.c=c;
        }
        public void openTV(){
              c.excute();
        }
}

测试

public class test {
      public static void main(String[] agrc) {
            command opnTV = new opentv();
           invoker xiaoming = new invoker("小明",opentv);
           xiaoming.open();
      }
 
}

(3)解释器

如有:A-->B-->C

非终止符:解释过程的中间产物,A、B都是非终止符。

终止符:解释的目标产物,C是终止符。

解释器:就是封装解释过程为对象,一个或多个,因为产物可能是非终止符。

例子:设计一个读卡器,北京或太原的老年和孕妇刷卡免费,其余人群标准价

抽象表达式

 public interface Expression {
     boolean interpret(String info);
 }

终结符表达式(具体实现者)

 public class TerminalExpression implements Expression{
     private Set<String> set = new HashSet<String>();
     public TerminalExpression(String[] data) {
         for (int i = 0; i < data.length; i++) {
             set.add(data[i]);
         }
     }
     public boolean interpret(String info) {
         if (set.contains(info)) {
             return true;
         }
         return false;
     }
 }

非终结符表达式(具体实现者)

 public class AndExpression implements Expression{
     //左半部分
     private Expression left;
     //右半部分
     private Expression right;
     //切分关键字
     public static final String FLEX = "的";
     public AndExpression(Expression city, Expression person) {
         this.left = city;
         this.right = person;
     }
     public boolean interpret(String info) {
         String s[] = info.split(FLEX);
         //符合文法的全部才会返回true
         return left.interpret(s[0]) && right.interpret(s[1]);
     }
 }

上下文Context

 public class Context {
     private String[] citys = {"北京", "太原"};
     private String[] persons = {"老人", "孕妇"};
     private Expression expression;
     public Context() {
         Expression city = new TerminalExpression(citys);
         Expression person = new TerminalExpression(persons);
         expression = new AndExpression(city, person);
     }
     public void freeRide(String info) {
         //提示语,可自行设置
         String s1 = "哔!"+info.split(FLEX)[1] + "卡,欢迎乘车,您本次乘车免费!";
         String s2 = "哔!欢迎乘车,您本次乘车扣费2元!";
         System.out.println(expression.interpret(info) ? s1 : s2);
     }
 }

程序调用

 //创建上下文运行环境,这里指刷卡用的bus
 Context bus = new Context();
 //不同人群刷卡
 System.out.println("公交乘车开始刷卡");
 bus.freeRide("北京的老人");
 bus.freeRide("太原的孕妇");
 bus.freeRide("太原的儿童");
 bus.freeRide("上海的老人");

输出

 公交乘车开始刷卡
 哔!老人卡,欢迎乘车,您本次乘车免费!
 哔!孕妇卡,欢迎乘车,您本次乘车免费!
 哔!欢迎乘车,您本次乘车扣费2元!
 哔!欢迎乘车,您本次乘车扣费2元!

(4)迭代器
为聚合类对象里的聚合元素提供顺序访问的方法。

例子:一学生容器 里用很多学生对象。先封装一迭代器来实现遍历访问

/**
 * @author: xuzhilei6656
 * @create: 2022-02-14
 * @description: 学生类
 **/
public class Student {
    /**
     * 姓名
     */
    private String name;
    /**
     * 学号
     */
    private String number;
 
    public Student(String name, String number) {
        this.name = name;
        this.number = number;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getNumber() {
        return number;
    }
 
    public void setNumber(String number) {
        this.number = number;
    }
 
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", number='" + number + '\'' +
                '}';
    }
}
/**
 * @author: xuzhilei6656
 * @create: 2022-02-14
 * @description: 抽象迭代器类
 **/
public interface StudentIterator {
    /**
     * 是否有下一个值
     * @return
     */
    boolean hasNext();
 
    /**
     * 取出下一个值
     * @return
     */
    Student next();
}
/**
 * @author: xuzhilei6656
 * @create: 2022-02-14
 * @description: 具体迭代器类
 **/
public class StudentIteratorImpl implements StudentIterator {
    private List<Student> list;
    private int position = 0;
 
    public StudentIteratorImpl(List<Student> list){
        this.list = list;
    }
 
    @Override
    public boolean hasNext() {
        return position < list.size();
    }
 
    @Override
    public Student next() {
        Student student = list.get(position);
        position++;
        return student;
    }
}
/**
 * @author: xuzhilei6656
 * @create: 2022-02-14
 * @description: 抽象容器类
 **/
public interface StudentAggregate {
    /**
     * 往容器添加元素
     * @param student
     */
    void addStudent(Student student);
 
    /**
     * 删除容器中元素
     * @param student
     */
    void removeStudent(Student student);
 
    /**
     * 获取迭代器
     * @return
     */
    StudentIterator getStudentIterator();
}
/**
 * @author: xuzhilei6656
 * @create: 2022-02-14
 * @description: 具体容器类
 **/
public class StudentAggregateImpl implements StudentAggregate {
    public static final List<Student> list = new ArrayList<>();
 
    @Override
    public void addStudent(Student student) {
        list.add(student);
    }
 
    @Override
    public void removeStudent(Student student) {
        list.remove(student);
    }
 
    @Override
    public StudentIterator getStudentIterator() {
        return new StudentIteratorImpl(list);
    }
}
/**
 * @author: xuzhilei6656
 * @create: 2022-02-14
 * @description: 测试
 **/
public class Client {
    public static void main(String[] args) {
        //创建容器对象
        StudentAggregate studentAggregate = new StudentAggregateImpl();
        //添加元素
        studentAggregate.addStudent(new Student("张三","123456"));
        studentAggregate.addStudent(new Student("李四","123789"));
        //获取迭代器
        StudentIterator studentIterator = studentAggregate.getStudentIterator();
        while (studentIterator.hasNext()){
            Student student = studentIterator.next();
            System.out.println(student);
        }
    }
}

(5)中介者

中介者对象有交互双方对象引用,交互双发只有中介者引用,即交互双发只能和中介者交互,再有中介者转发信息。

例子:详见这篇文章