面向对象——设计模式(行为型)

责任链模式(Chain of Responsibility)


import com.sun.deploy.security.SelectableSecurityManager;import java.util.List;public class Pattern{public static void main(String[] args){Handler fudaoyuan1=new fudaoyuan();Handler yuanzhang1=new yuanzhang();Handler xiaozhang1=new xiaozhang();fudaoyuan1.setNext(yuanzhang1);yuanzhang1.setNext(xiaozhang1);fudaoyuan1.HandleRequest(9);}
}abstract class Handler{protected Handler next;public void setNext(Handler next){ //sussessor 后继者this.next=next;}public abstract void HandleRequest(int request);
}class fudaoyuan extends Handler{ //<=7 ConcreteHandler@Overridepublic void HandleRequest(int request){if(request<=7)System.out.println("辅导员审批通过");else if (next != null)next.HandleRequest(request);elseSystem.out.println("无法审批");}
}class yuanzhang extends Handler{ //<=15 ConcreteHandler@Overridepublic void HandleRequest(int request){if(request<=15)System.out.println("院长审批通过");else if(next != null)next.HandleRequest(request);elseSystem.out.println("无法审批");}
}class xiaozhang extends Handler{ //<=30 ConcreteHandler@Overridepublic void HandleRequest(int request){if(request<=30)System.out.println("校长审批通过");else if(next != null)next.HandleRequest(request);elseSystem.out.println("无法审批");}
}
命令模式(Command)


import com.sun.deploy.security.SelectableSecurityManager;import java.util.List;public class Pattern{public static void main(String[] args){TV tv=new TV();Command onCommand=new OnCommand(tv);Command offCommand=new OffCommand(tv);Yaokongqi yaokongqi=new Yaokongqi();yaokongqi.setCommand(onCommand);yaokongqi.call();System.out.println("这是一条分割线");yaokongqi.setCommand(offCommand);yaokongqi.call();}
}class Yaokongqi{ //Invoker 请求者private Command command;//设置请求者的请求命令public void setCommand(Command command){this.command=command;}//调用public void call(){command.Execute();}}interface Command{public void Execute(); //执行命令
}class OnCommand implements Command{ // 开机命令 ConcreteCommand 具体命令private TV tv;public OnCommand(TV tv){this.tv=tv;}@Overridepublic void Execute() {tv.OnAction();}
}class OffCommand implements Command{private TV tv;public OffCommand(TV tv){this.tv=tv;}@Overridepublic void Execute() {tv.OffAction();}
}class TV{ //Receiver 接受者public void OnAction(){System.out.println("开机啦");}public void OffAction(){System.out.println("关机啦");}}
解释器模式(Interpreter Pattern)



import com.sun.deploy.security.SelectableSecurityManager;import java.util.*;public class Pattern{public static void main(String[] args){Context context=new Context();context.check("A区的测试人员");context.check("C区的开发人员");context.check("D区的调试人员");}
}//Context 环境 上下文
class Context{private String[] regions={"A区","B区","C区"};private String[] persons={"开发人员","调试人员","测试人员"};private NonterminalExpression non;public Context(){TerminalExpression region=new TerminalExpression(regions);TerminalExpression person=new TerminalExpression(persons);non=new NonterminalExpression(region,person);}public void check(String info){boolean bool=non.Interpret(info);if(bool)System.out.println("识别成功");elseSystem.out.println("识别失败");}
}//TerminalExpression 终结符实例
class TerminalExpression implements Expression{private Set<String> set=new HashSet<>();public TerminalExpression(String[] data){for(String str:data)set.add(str);}@Overridepublic boolean Interpret(String info){return set.contains(info);}
}//NonterminalExpression 非终结符class NonterminalExpression implements Expression{private TerminalExpression region;private TerminalExpression person;public NonterminalExpression(TerminalExpression region,TerminalExpression person){this.region=region;this.person=person;}@Overridepublic boolean Interpret(String info) {//B区的调试人员 --》str={"B区","调试人员"}String[] string=info.split("的");return region.Interpret(string[0]) && person.Interpret(string[1]);}
}//AbstractExpression 抽象接口 声明一个程序的解释方法
interface Expression{//输入数据来自于Contextpublic boolean Interpret(String info);}
迭代器模式(Iterator)


import com.sun.deploy.security.SelectableSecurityManager;import java.util.*;public class Pattern{public static void main(String[] args){BookAggregate bookAggregate=new BookAggregate();String[] names={"数据结构","操作系统","计算机网络","计算机组成原理"};double[] prices={10.24,11.08,40.96,81.92};for (int i=0;i<4;i++)bookAggregate.Add(new Book(names[i],prices[i]));Iterator bookIterator=bookAggregate.CreateIterator();while (bookIterator.hasNext()) {Book book=(Book)bookIterator.next();System.out.println(book.getName()+" "+book.getPrice());}}
}interface Iterator{public boolean hasNext();public Object next();}class BookIterator implements Iterator{private int index; //索引private BookAggregate bookAggregate; //聚合器public BookIterator(BookAggregate bookAggregate){this.index=0;this.bookAggregate=bookAggregate;}@Overridepublic boolean hasNext() {if(index<bookAggregate.getSize())return true;elsereturn false;}@Overridepublic Object next() {Object object= bookAggregate.Get(index);index++;return object;}
}interface Aggregate{public Iterator CreateIterator();}class BookAggregate implements Aggregate{private List<Book> list=new ArrayList<Book>();public void Add(Book book){list.add(book);}public Book Get(int index){return list.get(index);}public int getSize(){return list.size();}@Overridepublic Iterator CreateIterator() {return new BookIterator(this);}
}class Book{private String name;private double price;public Book(String name,double price){this.name=name;this.price=price;}public String getName(){return name;}public double getPrice(){return price;}
}
中介者模式(Mediator)


如果有多个同事:

import java.util.*;
//Mediator Pattern 中介者模式
public class Pattern{public static void main(String[] args){ConcreteMediator mediator=new ConcreteMediator();Colleague colleague1=new Colleague1(mediator);Colleague colleague2=new Colleague2(mediator);mediator.setColleague1(colleague1);mediator.setColleague2(colleague2);colleague1.sendMessage("123");colleague2.sendMessage("456");}
}//抽象中介者
abstract class Mediator{public abstract void sendMessage(String message,Colleague colleague);
}//具体中介者
class ConcreteMediator extends Mediator{private Colleague colleague1;private Colleague colleague2;public void setColleague1(Colleague colleague1){this.colleague1=colleague1;}public void setColleague2(Colleague colleague2){this.colleague2=colleague2;}@Overridepublic void sendMessage(String message,Colleague colleague){if(colleague==colleague1) {colleague2.receiveMessage(message); //如果是1发送的消息就将消息传给2}elsecolleague1.receiveMessage(message);}}//抽象同事
abstract class Colleague{protected Mediator mediator;public abstract void sendMessage(String message);public abstract void receiveMessage(String message);}//同事1
class Colleague1 extends Colleague{public Colleague1(Mediator mediator){this.mediator=mediator;}public void sendMessage(String message){mediator.sendMessage(message,this);}public void receiveMessage(String message){System.out.println("同事1收到消息:"+message);}}//同事2
class Colleague2 extends Colleague{public Colleague2(Mediator mediator){this.mediator=mediator;}public void sendMessage(String message){mediator.sendMessage(message,this);}public void receiveMessage(String message){System.out.println("同事2收到消息:"+message);}}
备忘录模式(Memento)








观察者模式(Observer)


import java.util.*;
//Observer Pattern 观察者模式
public class Pattern{public static void main(String[] args){Subject subject1=new ConcreteSubject("目标1");Observer observer1=new ConcreteObserver("张三",subject1);Observer observer2=new ConcreteObserver("李四",subject1);Observer observer3=new ConcreteObserver("王五",subject1);//System.out.println("目标1的状态发生改变");subject1.setState("更新啦");//subject1.Notify();}
}//目标接口
interface Subject{//添加观察者public void Attach(Observer observer);//删除观察者public void Detach(Observer observer);//状态改变后通知所有观察者改变状态public void Notify();public void setState(String state);public String getState();}class ConcreteSubject implements Subject{private List<Observer> observerList;private String state;private String name;public ConcreteSubject(String name){state="未更新";this.name=name;observerList=new ArrayList<Observer>();}public void Attach(Observer observer){observerList.add(observer);}public void Detach(Observer observer){observerList.remove(observer);}public void Notify(){for (Observer observer:observerList)observer.update();}public void setState(String state){this.state=state;System.out.println(name+"的状态发生改变"+state);Notify();}public String getState(){return state;}}//观察者接口
interface Observer{//更新观察者状态public void update();}class ConcreteObserver implements Observer{private String name;private Subject subject;private String stste;public ConcreteObserver(String name,Subject subject){this.name=name;this.subject=subject;stste=subject.getState();subject.Attach(this);}@Overridepublic void update() {System.out.println(name + "收到通知");stste=subject.getState();System.out.println(name+"改变状态后为:"+stste);}
}
模版方法模式(Template Method)





状态模式(State)

import java.util.*;
//State Pattern 状态模式
public class Pattern{public static void main(String[] args){Context context=new Context();System.out.println(context.getState());context.request();context.request();context.request();System.out.println(context.getState());context.request();}
}class Context{ //上下文 贩卖机private int count;private State state;public void request(){state.handle(this);}public Context(){count=3;state=new stateA();}public int getCount() {return count;}public void setCount(int count) {this.count = count;}public void setState(State state) {this.state = state;}public State getState() {return state;}
}interface State{public void handle(Context context);}class stateA implements State{ //有货@Overridepublic void handle(Context context) {int count=context.getCount();if (count>=1){System.out.println("购买成功");context.setCount(count-1);if (context.getCount()==0)context.setState(new stateB());}elseSystem.out.println("购买失败");}
}class stateB implements State{ //无货@Overridepublic void handle(Context context) {int count=context.getCount();if(count==0){System.out.println("购买失败");context.setCount(5);System.out.println("补货成功,重新购买");context.setState(new stateA());}}
}
策略模式(Strategy)


例如:超市不同等级会员打折程度不同
import java.util.*;
//Strategy Pattern 策略模式
public class Pattern{public static void main(String[] args){Strategy add=new AddStrategy();Strategy sub=new SubStrategy();Strategy multiply=new MultiplyStrategy();OperationContext context=new OperationContext(add);context.operation(200,340);context=new OperationContext(sub);context.operation(200,340);context=new OperationContext(multiply);context.operation(200,340);}
}class OperationContext{ //上下文private Strategy strategy;public OperationContext(Strategy strategy){this.strategy=strategy;}public void operation(int a,int b){strategy.TwoNumberOperation(a,b);}}interface Strategy{public void TwoNumberOperation(int a,int b);}class AddStrategy implements Strategy{public void TwoNumberOperation(int a,int b){System.out.println(a+b);}
}class SubStrategy implements Strategy{public void TwoNumberOperation(int a,int b){System.out.println(a-b);}
}class MultiplyStrategy implements Strategy{public void TwoNumberOperation(int a,int b){System.out.println(a*b);}
}
访问者模式(Visitor)



import java.util.*;
//Visitor Pattern 访问者模式
public class Pattern{public static void main(String[] args){PersonStructure structure=new PersonStructure();Visitor visitor1=new visitor1();System.out.println("访问者1的访问记录:");structure.Accept(visitor1);Visitor visitor2=new visitor2();System.out.println("访问者2的访问记录:");structure.Accept(visitor2);}
}interface Visitor{public void visitStudent(Student student);//访问public void visitTeacher(Teacher teacher);}class visitor1 implements Visitor{ //访问者1@Overridepublic void visitStudent(Student student) {System.out.println("访问者1访问学生:"+student.name); }@Overridepublic void visitTeacher(Teacher teacher) {System.out.println("访问者1访问老师:"+teacher.name); }
}class visitor2 implements Visitor{ //访问者2@Overridepublic void visitStudent(Student student) {System.out.println("访问者2访问学生:"+student.name);}@Overridepublic void visitTeacher(Teacher teacher) {System.out.println("访问者2访问老师:"+teacher.name);}
}class PersonStructure{private List<Person> personlist=new ArrayList<>();public PersonStructure(){personlist.add(new Student("zhangsan"));personlist.add(new Student("lisi"));personlist.add(new Student("wangwu"));personlist.add(new Teacher("hanmei"));personlist.add(new Teacher("liuyang"));personlist.add(new Teacher("zhaona"));}public void Accept(Visitor visitor){for(Person person:personlist){person.Accept(visitor);}}
}//element
abstract class Person{public String name;public abstract void Accept(Visitor visitor);
}class Student extends Person{public Student(String name){this.name=name;}@Overridepublic void Accept(Visitor visitor) {visitor.visitStudent(this);}
}class Teacher extends Person{public Teacher(String name){this.name=name;}@Overridepublic void Accept(Visitor visitor) {visitor.visitTeacher(this);}
}
import java.util.*;
//Visitor Pattern 访问者模式
public class Pattern{public static void main(String[] args){PersonStructure structure=new PersonStructure();Visitor1 visitor1=new Visitor1();System.out.println("访问者1的访问记录:");structure.Accept(visitor1);System.out.println("学生年龄的总和:"+visitor1.getStudentAge());System.out.println("老师年龄的总和:"+visitor1.getTeacherAge());Visitor2 visitor2=new Visitor2();System.out.println("访问者2的访问记录:");structure.Accept(visitor2);System.out.println("学生最高成绩:"+visitor2.getMaxScore());System.out.println("老师最高工龄:"+visitor2.getMaxWorkAge());}
}interface Visitor{public void visitStudent(Student student);//访问public void visitTeacher(Teacher teacher);}class Visitor1 implements Visitor{ //访问者1 分别统计老师和学生的年龄总和private int studentAge=0;private int teacherAge=0;public int getStudentAge() {return studentAge;}public int getTeacherAge() {return teacherAge;}@Overridepublic void visitStudent(Student student) {System.out.println("访问者1访问学生:"+student.getName()+" 年龄:"+student.getAge());studentAge+=student.getAge();}@Overridepublic void visitTeacher(Teacher teacher) {System.out.println("访问者1访问老师:"+teacher.getName()+" 年龄:"+teacher.getAge());teacherAge+=teacher.getAge();}
}class Visitor2 implements Visitor{ //访问者2 分别求出最高年龄和工龄private int maxScore=-1;private int maxWorkAge=-1;public int getMaxScore() {return maxScore;}public int getMaxWorkAge() {return maxWorkAge;}public void visitStudent(Student student) {System.out.println("访问者2访问学生:"+student.getName()+" 成绩:"+student.getGrade());if(student.getGrade()>maxScore)maxScore=student.getGrade();}@Overridepublic void visitTeacher(Teacher teacher) {System.out.println("访问者2访问老师:"+teacher.getName()+" 工龄:"+teacher.getWorkYear());if(teacher.getWorkYear()>maxWorkAge)maxWorkAge=teacher.getWorkYear();}
}class PersonStructure{private List<Person> personlist=new ArrayList<>();public PersonStructure(){personlist.add(new Student("zhangsan",20,70));personlist.add(new Student("lisi",22,90));personlist.add(new Student("wangwu",25,99));personlist.add(new Teacher("hanmei",26,1));personlist.add(new Teacher("liuyang",39,12));personlist.add(new Teacher("zhaona",50,23));}public void Accept(Visitor visitor){for(Person person:personlist){person.Accept(visitor);}}
}//element
abstract class Person{private String name;private int age;public Person(String name,int age){this.name=name;this.age=age;}public abstract void Accept(Visitor visitor);public String getName() {return name;}public int getAge() {return age;}
}class Student extends Person{private int grade;public Student(String name,int age,int grade){super(name,age);this.grade=grade;}public int getGrade() {return grade;}@Overridepublic void Accept(Visitor visitor) {visitor.visitStudent(this);}
}class Teacher extends Person{private int workYear;public Teacher(String name,int age,int workYear){super(name,age);this.workYear=workYear;}public int getWorkYear() {return workYear;}@Overridepublic void Accept(Visitor visitor) {visitor.visitTeacher(this);}
}