Java_23种设计模式(四)----- 行为型模式
来源:互联网 发布:淘宝游戏专营店铺 编辑:程序博客网 时间:2024/06/06 01:01
/* * 行为型模式: 4类11种 * 第一类: 父类与子类的关系 --- 继承关系 * 1. 策略模式 * 2. 模板方法模式 * 第二类: 两个类之间 --- 不存在继承关系 * 3. 观察者模式 * 4. 迭代子模式 * 5. 责任链模式 * 6. 命令模式 * 第三类: 类的状态 * 7. 备忘录模式 * 8. 状态模式 * 第四类: 通过中间类 * 9. 访问者模式 * 10. 中介者模式 * 11. 解释器模式 */public class ConstructModel { // 1. 策略模式 ICalculator cal = new Plus(); cal.calculate("111"); // 2. 模板方法模式 AbstractCalculator1 c = new Plus1(); c.calculate("111"); // 3. 观察者模式 Subject s = new MySubject(); s.add(new Observer1()); s.add(new Observer2()); s.operation(); // 4. 迭代子模式 Collection c = new MyCollection(); Iterator it = c.iterator(); it.first(); // 5. 责任链模式 MyHander h1 = new MyHander("1"); MyHander h2 = new MyHander("2"); MyHander h3 = new MyHander("3"); h2.setHandler(h3); h1.setHandler(h2); h1.operation(); // 6. 命令模式 Invoker i = new Invoker(new MyCommand(new Receiver())); i.action(); // 7. 备忘录模式 Original o = new Original("egg"); Storage s = new Storage(o.createMemento()); o.setValue("111"); o.restoreMemento(s.getMemento()); // 8. 状态模式 Context c = new Context(new State("fuck")); c.method(); // 9. 访问者模式 Visitor visitor = new MyVisitor1(); Subject sub = new MySubject1(); sub.accept(visitor); // 10. 中介者模式 Mediator m = new MyMediator(); m.createMediator(); m.workAll(); // 11. 解释器模式 // 9 + 2 -8 int result = new Minus1().interrupt(new Context1( new Plus1().interrupt(new Context1(9,2)), 8)); System.out.println(result);}/* * 解释器模式(Interpreter) ---- 一般主要应用在OOP开发中的编译器开发,使用面窄 * 主要用来做各种各样的编译器, 如正则表达是的解释器等 */ class Minus implements Expression { public int interpret(Context1 context) { return context.getNum1() - context.getNum2(); }}class Plus1 implements Expression { public int interpret(Context1 context ) { return context.getNum1() + context.getNum2(); }}interface Expression { int interpret(Context1 context);}// Context 类是一个上下文环境类, Plus和Minus分别是用来计算的实现class Context1 { private int num1; private int num2; public Context(int num1, int num2) {this.num1 = num1; this.num2 = num2;} public void setNum1(int num1) {this.num1 = num1;} public void setNum2(int num2) {this.num2 = num2;} public int getNum1() {return this.num1;} public int getNum2 () {return this.num2;}}/* * 中介者模式(Mediator) ---- 用来降低类之间的耦合 类似于spring容器 * 如果类类之间有依赖关系的话, 不利于功能的扩展和维护。因为只要修改一个对象,其他关联的对象都得进行修改 * 最终对客户开放的类是MyMediator */class MyMediator implements Mediator { private User user1; private User user2; public User getUser1() {return this.user1;} public User getUser2 () {return this.user2;} public void createMediator () { user1 = new User1(); user2 = new User2(); } public void work () { user1.work(); user2.work(); }}class User2 extends User { public void work () {System.out.println("User2 -> work");}}class User1 extends User { public void work () {System.out.println("User1 -> work");}}abstract class User { private Mediator mediator; public Mediator getMediator() {return this.mediator;} public User(Mediator m) {this.mediator = m;} public abstract void work();}interface Mediator { void createMediator(); void workAll();}/* * 访问者模式 ----- 把数据结构和作用于数据结构上的操作解耦,使得操作集合可相对自由地演化 * 该模式适用于数据结构相对稳定, 算法又易变化的系统 * 优点: 将有关行为集中到一个访问者对象中,其改变不影响系统结构 * 缺点: 增加新的数据结构很困难 * 目的: 一种分离对象数据结构与行为的方法,通过这种分离,可达到一个被访问者动态添加新的操作而无需做其他修改的效果 * visitor1 -> 相当于算法和行为 * mysubject1 -> 相当于数据结构 */class MySubject1 implements Subject1 { public void accept (Visitor1 visitor) {visitor.visit(this);} public String getSubject() {return "fuck";}}interface Subject1 { void accept(Visitor1 visitor); String getSubject();} class MyVisitor1 implements Visitor1 { public void visit(Subject1 sub ) {System.out.println("MyVisitor1 -> visit"); sub.getSubject();}}interface Visitor1 { void visit(Subject1 sub);}/* * 状态模式 ----- 当对象的状态改变时, 同时改变其行为 * 两点: 1、 通过改变状态来获得不同的行为 * 2、 其他对象能获取到变化 */class Context { private State state; public Context(State state ) {this.state = state;} public void method () { if ( "state1".equals(state.getValue())) { state.method1(); } else { state.method2(); } }} class State { private String value; public State(String value) {this.value = value;} public void setValue(String value ) {this.value = value;} public String getValue () {return this.value;} public void method1 () {System.out.println("State -> method1");} public void method2 () {System.out.println("State -> method2");}}/* * 备忘录模式(Memento) ----- 目的: 保存一个对象的某个状态,以便在适当的时候恢复对相关 * 假设有原始类A, A中有各种属性,A可以决定要备份的属性,备忘录B是用来存储A的一些内部类 * 类C, 是一个用来存储备忘录B的,且只能存储,不能修改操作 */class Storage { private Memento memento; public Storage(Memento memento) {this.memento = memento;} public Memento getMemento() {return this.memento;} public void setMemento(Memento m ) {this.memento = m;}}class Memento { private String value; public Memento(String value) {this.value = value;} public String getValue() {return this.value;}}class Original { private String value; public Original(String value) {this.value = value;} public String getValue() {return this.value;} public void setValue(String value) {this.value = value;} public Memento createMemento() { return new Memento(value);} public void resotreMemento(Memento m) {this.value = m.getValue();} }/* * 命令模式 ---- 目的: 达到命令发出者和执行者之间解耦,实现请求和执行分开,跟strut是相似 * 例子: 司令员下令让士兵去干件事 * 司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行 * 三者相互解耦 * 但是实际上,口令作为中间传输的连接,负责连接司令员和士兵,三者之间达到两两连接,实际操作者只有司令员和士兵,达到两者解耦效果 */class Invoker { // 司令员 private Command command; public Invoker (Command command) {this.command = command;} public void action() {command.exe();}}class Receiver { // 士兵 public void action() {System.out.println("Receiver -> action");}}class MyCommad implements Command { private Receiver receiver; public MyCommand(Receiver receiver) {this.receiver = receiver;} public void exe() {receiver.action();}}interface Command { void exe();}/* * 责任链模式------有多个对象,每个对象持有下一个对象的引用,会形成一条链,请求在这条链上传递,知道某一对象决定处理该请求 * 作用: 在隐瞒客户端的情况下,对系统进行动态的调整 * 注意: 链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,需要自己实现 * 同时在同一时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象 */class MyHandler extends AbstractHandler { private String name; public MyHander(String name ) {this.name = name;} public void Operation () { if ( getHandler() != null ) { getHandler().operation(); } }}abstract class AbstractHandler implements Handler { private Handler handler; public Hander getHandler () {return this.handler;} public void setHandler(Handler handler) {this.handler = handler;}}interface Handler { void operation();} /* * 迭代子模式 --- 顺序访问聚集中的对象,一般来说,集合中非常常见 * 两层意思: 1. 需要遍历的对象,即聚集对象 * 2. 迭代器对象,用于对聚集对象进行遍历访问 */class MyIterator implements Iterator { private Collection c; private int pos = -1; public MyIterator(Collection c ) {this.c = c;} public Object previous() { if ( pos > 0 ) { pos--; } return c.get(pos); } public Object next () { if ( pos < c.size() ) { pos++; } return c.get(pos); } public boolean hasNext() { if ( pos < c.size() - 1 ) { return true; } return false; } public Object first() { pos = 0; return c.get(pos); }}class MyCollection implements Collection { public String str[] = {"A", "B", "C", "D"}; public Iterator iterator() { return new Iterator(this); } public Object get(int i) {return str[i];} public int size() {return str.lenth;}}interface Iterator { Object previous(); Object next(); boolean hasNext(); Object first();}interface Collection { Iterator iterator(); Object get(int i); int size();}/* * 观察者模式 ---- 类似于邮件订阅 * 当一个对象变化时,其他依赖该对象的对象都会受到通知,并且随着变化。对象之间是一种一对多的关系 */class MySubject extends AbstractSubject { public void option() { notifyObserver(); }}abstract class AbstractSubject implements Subject { Vector<Observer> vector = new Vector<Observer>(); public void add(Objserver o) {vector.add(o);} public void del(Objserver o) {vector.remove(o);} public void notifyObserver() { Enumeration<Observer> enum = vector.elements(); while (enum.hasMoreElements()) { enum.nextElement().update(); } }}interface Subject{ void add(Observer o); void del(Observer o); void notifyObserver(); void option();}class Observer2 implements Observer { public void update () {System.out.println("Observer2 -> update");}}class Observer1 implements Observer { public void update() {System.out.println("Observer1 -> update");}} interface Observer { void update();}/* * 模板方法模式 * 一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法 * 同时定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用 */class Minus2 extends AbstractCalculator1 { public int calculate(String exp){return 0;}}class Plus3 extends AbstractCalculator1 { public int calculate(String exp) {return 0;}}abstract class AbstractCalculator1 { // 主方法 public int calculate(String exp, String opt) {return calculate(exp);} // 抽象方法,被子类重写的方法 public abstract int calculate(String exp);}/* * 策略模式 -------定义一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户 * 就是一个父类,多个子类。父类引用指向子类对象 * 策略模式多用在算法决策系统中 */class Minus extends AbstractCalculate implements ICalculator { public int calculate(String exp) {return 0;}}class Plus extends AbstractCalculate implements ICalculator { public int calculate(String exp) {return 0;}} // 辅助类abstract class AbstractCalculate implements ICalculator { public int[] split(String exp, String opt) {return null;}}interface ICalculator { int calculate(String exp);}
阅读全文
0 0
- Java_23种设计模式(四)----- 行为型模式
- Java_23种设计模式(二)----- 创建型模式
- Java_23种设计模式(三)----- 结构型模式
- Java_23种设计模式(一)
- java_23种设计模式之策略模式
- java_23种设计模式之代理模式
- java_23种设计模式之多例模式
- java_23种设计模式之门面模式
- java_23种设计模式之适配器模式
- 设计模式(四) 行为型模式
- Java_23种经典设计模式详解
- 设计模式(四):行为型模式之命令模式
- 设计模式-行为型软件设计模式(四)
- java_23种设计模式之单例模式
- java_23种设计模式之工厂方法模式
- java_23种设计模式之抽象工厂模式
- java_23种设计模式之模板方法模式
- java_23种设计模式之建造者模式
- linux网桥的管理和搭建
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- 抽象类(abstract class)与接口(interface)的异同
- Linux文件与目录的三种时间状态(mtime,atime,ctime)区别
- msysgit安装及使用教程大全
- Java_23种设计模式(四)----- 行为型模式
- wc命令
- IAR for ARM 工程模版不兼容修改方法
- BZOJ 2333 [SCOI2011]棘手的操作
- LeetCode练习中等卷
- JZOJ1261. 数字游戏 (2017.8B组)
- 微信、微博、贴吧平台涉嫌违反《网络安全法》被立案调查 审查
- 敌兵布阵 HDU
- SpringBoot Singleton beanFactory