• [转]设计模式的例子


    本文转自:http://blog.csdn.net/liqj2ee/article/details/315619

    ////////////////////////////////////////////////////////////////////

    创建模式

    ////////////////////////////////////////////////////////////////////

    //FactoryMethod模式的例子

    package pattern.a.factoryMethod;

    interface Product {
     
      void operation();

    }

    class ConProduct1 implements Product {
     
      //不同的实现可以有不同的产品操作
      public void operation() {}

    }

    class ConProduct2 implements Product {
     
      //不同的实现可以有不同的产品操作
      public void operation() {}

    }


    interface Factory {
     
      Product CreateProduct();

      void operation1();
     
    }

    class ConFactory1 implements Factory {
     
      //不同的实体场类 在创建产品是可以有不能的创建方法
      public Product CreateProduct() {
          Product product = new ConProduct1();
          operation1();
          return product;
      }
     
      public void operation1() {}

      public static Factory getFactory() {
          return new ConFactory1();
      }
    }

    class ConFactory2 implements Factory {
     
      //不同的实体场类 在创建产品是可以有不能的创建方法
      public Product CreateProduct() {
          Product product = new ConProduct2();
          operation1();
          return product;
      }
     
      public void operation1() {}

      //
      public static Factory getFactory() {
          return new ConFactory2();
      }
    }

    public class FactoryMethod {
      public static void main(String[] args) {
          Factory factory = ConFactory1.getFactory();
          Product product = factory.CreateProduct();
          product.operation();
      }
    }


    ***********************************************************************


    //AbstractoryFactory模式的例子
    //我觉得这个模式与FactoryMethod 就是创建产品的数量上有区别

    package pattern.a.abstractfactory;

    //产品A的接口和实现
    interface ProductA {}

    class ProductA1 implements ProductA {}

    class PorductA2 implements ProductA {}

    //产品B的接口和实现
    interface ProductB {}

    class ProductB1 implements ProductB {}

    class ProductB2 implements ProductB {}

    //工程和工厂的实现
    interface Factory {
       
        ProductA CreateA();
       
        ProductB CreateB();

    }

    //1工厂产生1系列产品
    class ConFactory1 implements Factory {
       
        public ProductA CreateA() {
            return new ProductA1();
        }
       
        public ProductB CreateB() {
            return new ProductB1();
        }
       
    }

    //2工厂产生2系列产品
    class ConFactory2 implements Factory {
       
        public ProductA CreateA() {
            return new PorductA2();
        }
       
        public ProductB CreateB() {
            return new ProductB2();
        }
       
    }

    class ConFactory {}

    public class AbstractFactory {

        public static void main(String[] args) {
            //1工厂产生1类产品
            Factory factory1 = new ConFactory1();
            ProductA a1 = factory1.CreateA();
            ProductB b1 = factory1.CreateB();
           
            //2工厂产生2类产品
            Factory factory2 = new ConFactory1();
            ProductA a2 = factory2.CreateA();
            ProductB b2 = factory2.CreateB();       
        }
    }


    ***********************************************************************


    //Builder模式的例子
    // 模式的宗旨是 将部件创建的细节 和部件的组装方法分离!!! 考兄弟悟性要高

    package pattern.a.builder;

    class director {
       
        //construct 中存放着组装部件的逻辑 注意 逻辑的分离
        public Product construct(Builder builder) {
            builder.buildPart1();
            builder.buildPart2();
            operation();
            Product product = builder.retrieveProduct();
            return product;
        }
       
        public void operation() {}
    }

    class Product {}

    interface Builder {
       
        void buildPart1();
       
        void buildPart2();
       
        Product retrieveProduct();
       
    }

    class ConBuilder1 implements Builder {
       
        public void buildPart1() {}
       
        public void buildPart2() {}
       
        public Product retrieveProduct() {
            return null;
        }
       
    }

    class ConBuilder2 implements Builder {
       
        public void buildPart1() {}
       
        public void buildPart2() {}
       
        public Product retrieveProduct() {
            return null;
        }   
       
    }

    public class BuilderPattern {

        public static void main(String[] args) {
        }
       
    }


    ***********************************************************************


    //Singleton模式例子

    package pattern.a.singleton;

    // 一种简单的形式
    class SingletonExample {
     
     private static SingletonExample instance;
     
     private SingletonExample() {}
     
     public static SingletonExample getInstance() {
      
      if (instance == null) {
       instance = new SingletonExample();
      }
      return instance;
     }  
     
     synchronized public static SingletonExample getInstance1() {
      
      if (instance == null) {
       instance = new SingletonExample();
      }
      return instance;
      
     } 
     
     public static SingletonExample getInstance2() {
      
      synchronized(SingletonExample.class) {
       if (instance == null) {
        instance = new SingletonExample();
       }
      }
      return instance;
      
     }
    }

    //利用类加载时 初始化只产生一次
    class SingletonExample2 {
     
     private static SingletonExample2 instance = new SingletonExample2();
     
     private SingletonExample2() {}
     
     public static SingletonExample2 getInstance() {
      
      return instance;
      
     }
    }

    public class SingletonPattern {

     public static void main(String[] args) {
     }
    }


    ***********************************************************************


    //Prototype模式例子

    package pattern.a.prototype;

    interface Prototype {
        Prototype myclone();
    }

    class ConPrototype1 implements Prototype{
        private String a;
       
        public ConPrototype1(String a) {
            this.a = a;
        }
       
        public Prototype myclone() {
            return new ConPrototype1(a);
        }
    }

    class ConPrototype2 implements Prototype{
        private int b;
       
        public ConPrototype2(int b) {
            this.b = b;
        }
       
        public Prototype myclone() {
            return new ConPrototype2(b);
        }
    }

    public class PrototypePattern {
        public static void main(String[] args) {
            Prototype inst1 = new ConPrototype1("testStr1");
            Prototype inst2 = null;
            inst2 = inst1.myclone();
        }
    }


    ***********************************************************************


    ////////////////////////////////////////////////////////////////////

    结构模式

    ////////////////////////////////////////////////////////////////////

    //Adapter模式的例子

    package pattern.b.Adapter;

    // 类适配
    interface Target1 {
     
     void request();
     
    }

    class Adaptee1 {
     
        public void specRequest() {}

    }

    class Adapter1 extends Adaptee1 implements Target1 {

     public void request() {
      super.specRequest();
     }

    }

    //对象适配

    interface Target2 {
     
     void request();

    }

    class Adaptee2 {

        public void specRequest() {}

    }

    class Adapter2 implements Target2 {

     private Adaptee2 adaptee;
     
     public Adapter2(Adaptee2 adaptee) {
      this.adaptee = adaptee;
     }
     
     public void request() {
         adaptee.specRequest();
     }

    }

    public class AdapterPattern {

     public static void main(String[] args) {
     }
     
    }


    ***********************************************************************


    //Proxy模式例子

    package pattern.b.proxy;

    interface Subject {
     
     void request();
     
    }

    //真正处理请求的地方
    class RealSubject implements Subject {
     
     public void request() {
      
      System.out.println("real access");
      
     }
     
    }

    //ProxySubject是与用户交互的类 他是REalSubject的代理
    //在处理功能之上的一层  这里可以做前操作 后操作 例如可以验证是否处理请求。
    class ProxySubject implements Subject {
     
     private RealSubject real;
     
     public ProxySubject(RealSubject real) {
      this.real = real;
     }
     
     //
     public void request() {
      
      preRequest();
      real.request();
      afterRequest();
      
     }
     
     private void preRequest() {}
     
     private void afterRequest() {}
     
    }


    //java自身提供代理类使用反射机制

    public class ProxyPattern {

     public static void main(String[] args) {
     }

    }

    ***********************************************************************


    //Composite 模式例子
    //在用户的角度 并不知道 不见是单独的还是符合的 只要调用接口级方法 operation

    package pattern.b.composite;

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;

    // 安全模式 在接口级只提供部分功能 leaf 和 composite 有不同的功能
    interface Component1 {
       
        public void operation();
       
    }

    class leaf1 implements Component1 {
       
        public void operation() {
            System.out.println("this is the leaf1");
        }
       
    }

    class Composite1 implements Component1 {
        private List components;
       
        public Composite1() {
            components = new ArrayList();
        }
       
        public void operation() {
            Iterator it = components.iterator();
            Component1 com = null;
            while (it.hasNext()) {
                com = (Component1) it.next();
                com.operation();
            }
        }
       
        public void addComponent(Component1 com) {
            components.add(com);
        }
       
        public void removeComponent(int index) {
            components.remove(index);
        }
       
    }

    // 透明模式 接口定义全部功能 leaf中可能使用空方法或抛出异常 活着写一层 抽象类 写上默认实现方法(极端情况下 是空或异常)


    interface Component2 {
       
        public void operation();
       
        public void addComponent(Component2 com);
       
        public void removeComponent(int index);
       
    }

    class leaf2 implements Component2 {
       
        public void operation() {
            System.out.println("this is the leaf1");
        }
       
        //这个使用空方法
        public void addComponent(Component2 com) {}
       
        //这个使用不支持异常
        public void removeComponent(int index){
            throw new UnsupportedOperationException();
        }
    }

    class Composite2 implements Component2 {
        private List components;
       
        public Composite2() {
            components = new ArrayList();
        }
       
        public void operation() {
            Iterator it = components.iterator();
            Component2 com = null;
            while (it.hasNext()) {
                com = (Component2) it.next();
                com.operation();
            }
        }
       
        public void addComponent(Component2 com) {
            components.add(com);
        }
       
        public void removeComponent(int index) {
            components.remove(index);
        }
       
    }

    //也可以用一个抽象类

    abstract class AbstractComponent implements Component2{
        public void operation() {}
       
        public void addComponent(Component2 com) {}
       
        abstract public void removeComponent(int index);   
    }

    public class CompositePattern {

        public static void main(String[] args) {
        }
       
    }


    ***********************************************************************


    //Flywight 模式例子
    // 将共同的跟不同的属性分离  共享共同属性 而不同属性由外部传入 进行特定操作

    package pattern.b.flyweight;
    import java.util.HashMap;
    import java.util.Map;

    // 1没有办法通过obj.value方式 2没有改变属性的方法 3不能通过继承重置属性 所以这个对象是 immutable 不可变的
    final class State {
        private String value = null;
       
        public State(String value) {
            this.value = value;
        }
       
        public String getValue() {
            return value;
        }
    }

    interface Flyweight {
        void operation(String extrinsicState);
    }

    class ConFlyweight1 implements Flyweight {
        //state 表示享元的内部状态
        //或者用构造函数传入
        private State state = new State("state1");
       
        //out 为外部传给享元的 外部状态
        public void operation(String out) {
            //使用外部状态和内部状态来执行 operation操作
            System.out.println("ConFlyweight1: " + out + state.getValue());
        }
    }

    // 充数的
    class ConFlyweight2 implements Flyweight {
        private State state = new State("state2");
       
        public void operation(String out) {
            System.out.println("ConFlyweight2: " + state.getValue() + out );
        }
    }

    class FlyweightFactory {
        Map flyweights = new HashMap();
       
        public Flyweight getFlyweight(String key) {
            if (flyweights.containsKey(key)) {
                return (Flyweight) flyweights.get(key);
            } else {
                // 这里就随便写的
                Flyweight flyweight = null;
                if (key.charAt(key.length() - 1) == '1') {
                    flyweight = new ConFlyweight1();
                    flyweights.put(key, flyweight);
                } else {
                    flyweight = new ConFlyweight2();
                    flyweights.put(key, flyweight);
                }
                return flyweight;
            }
        }
    }

    public class FlyweightPattern {
        public static void main(String[] args) {
            FlyweightFactory factory = new FlyweightFactory();
            Flyweight flyweight1a = factory.getFlyweight("flytest1");
            flyweight1a.operation("outparam1");
        }
    }


    ***********************************************************************


    // Bridge 模式例子
    //对一处的操作 改成引用一个对象 具体操作再另一个对象中进行 这样便于功能扩展

    package pattern.b.bridge;

    interface Implementor {
        void realOperation();
    }

    class ConImplementor1 implements Implementor {
        public void realOperation() {
            System.out.println("do the real operation1");
        }
    }

    class ConImplementor2 implements Implementor {
        public void realOperation() {
            System.out.println("do the real operation2");
        }
    }

    abstract class Abstraction {
        protected Implementor imp;
       
        public Abstraction(Implementor imp) {
            this.imp = imp;
        }
       
        protected void med0() {}
       
        abstract public void operation();
    }

    class ConAbstraction extends Abstraction{
        public ConAbstraction(Implementor imp) {
            super(imp);
        }
       
        public void operation() {
            med0();
            imp.realOperation();
        }
    }

    public class BridgePattern {
        public static void main(String[] args) {
            Implementor imp = new ConImplementor1();
            Abstraction abs = new ConAbstraction(imp);
            abs.operation();
        }
    }


    ***********************************************************************


    //Decorator 模式例子

    package pattern.b.decorator;

    //源部件和修饰类的共同接口
    interface Component {
        void operation();
    }

    class ConComponent implements Component {
        public void operation() {
            System.out.println("the begin operation");
        }
    }

    //没有提供给component赋值的方法 所以声明这个类为抽象的 这里并没有抽象的方法就是不像让这个类有实例
    abstract class Decotor implements Component{
        private Component component;
       
        public void operation() {
            component.operation();
        }
    }

    class ConDecotor1 extends Decotor {
        private Component component;
       
        public ConDecotor1(Component component) {
            this.component = component;
        }   
       
        public void operation() {
            super.operation();
            //!!注意这里 这里提供了功能的添加
            // 这里就是Decorator的核心部分 不是修改功能而是添加功能 将一个component传入装饰类调用对象的接口
            //方法 在此过程添加功能 重新实现接口方法的功能
            med0();
        }
       
        private void med0() {
            System.out.println("1");
        }
    }

    class ConDecotor2 extends Decotor {
        private Component component;
       
        public ConDecotor2(Component component) {
            this.component = component;
        }   
       
        public void operation() {
            super.operation();
            med0();
        }
       
        private void med0() {
            System.out.println("2");
        }
    }

    //class 

    public class DecoratorPattern {
        public static void main(String[] args) {
            //注意 起点位置是从一个ConComponent开始的!!
            Component component = new ConDecotor2(new ConDecotor1(new ConComponent()));
            component.operation();
        }
    }


    ***********************************************************************


    //Facade 的例子
    //在子系统上建立了一层 对外使用感觉比较简单 Facade的方法中封装与子系统交互的逻辑

    package pattern.b.facade;

    class Exa1 {
        public void med0() {}
    }

    class Exa2 {
        public void themed() {}
    }

    //这就是一个简单的Facade的方法的例子
    class Facade {
        public void facdeMed() {
            Exa1 exa1 = new Exa1();
            exa1.med0();
           
            Exa2 exa2 = new Exa2();
            exa2.themed();
        }
    }

    public class FacadePattern {
        public static void main(String[] args) {
        }
    }


    ***********************************************************************


    ////////////////////////////////////////////////////////////////////

    行为模式

    ////////////////////////////////////////////////////////////////////

    //Command 模式例子
    //感觉将一个类的方法 分散开了 抽象成了接口方法 注意 参数和返回值要一致
    //每个Command封装一个命令 也就是一种操作

    package pattern.c.command;

    //这个是逻辑真正实现的位置
    class Receiver {
        public void med1() {}
       
        public void med2() {}
    }

    interface Command {
        // 要抽象成统一接口方法 是有局限性的
        void execute();
    }

    class ConCommand1 implements Command{
        private Receiver receiver;
       
        public ConCommand1(Receiver receiver) {
            this.receiver = receiver;
        }
       
        public void execute() {
            receiver.med1();
        }
    }

    class ConCommand2 implements Command{
        private Receiver receiver;
       
        public ConCommand2(Receiver receiver) {
            this.receiver = receiver;
        }
       
        public void execute() {
            receiver.med2();
        }
    }

    class Invoker {
        private Command command;
       
        public Invoker(Command command) {
            this.command = command;
        }
       
        public void action() {
            command.execute();
        }
    }

    public class CommandPattern {
        public static void main(String[] args) {
            Receiver receiver = new Receiver();
            // 生成一个命令
            Command command = new ConCommand1(receiver);
            Invoker invoker = new Invoker(command);
            invoker.action();
        }
    }


    ***********************************************************************


    //Strategy 模式例子
    //Strategy中封装了算法

    package pattern.c.strategy;

    interface Strategy {
        void stMed();
    }

    class Constrategy1 implements Strategy  {
        public void stMed() {}
    }

    class constrategy2 implements Strategy  {
        public void stMed() {}
    }

    class Context {
        private Strategy strategy;
       
        public Context (Strategy strategy) {
            this.strategy = strategy;
        }
       
        public void ContextInterface() {
            strategy.stMed();
        }
    }

    public class StrategyPattern {
        public static void main(String[] args) {
        }
    }


    ***********************************************************************


    //State模式例子
    //将一种状态和状态的助理封装倒state中

    package pattern.c.state;

    class Context {
     private State state = new CloseState();
     
     public void changeState(State state) {
      this.state = state;
     }
     
     public void ruquest() {
      state.handle(this);
     }
    }

    interface State {
     void handle(Context context);
    }

    //表示打开状态
    class OpenState implements State{
     public void handle(Context context) {
      System.out.println("do something for open");
      context.changeState(new CloseState());
     }
    }

    //表示关闭状态
    class CloseState implements State{
     public void handle(Context context) {
      System.out.println("do something for open");
      context.changeState(new OpenState());
     }
    }

    public class StatePattern {
     public static void main(String[] args) {
     }
    }


    ***********************************************************************


    //Visitor模式例子
    //双向传入

    package pattern.c.visitor;
    import java.util.*;

    interface Visitor {
     void visitConElementA(ConElementA conElementA);
     void visitConElementB(ConElementB conElementB);
    }

    class ConVisitor1 implements Visitor{
     public void visitConElementA(ConElementA conElementA) {
      String value = conElementA.value;
      conElementA.operation();
      //do something
     }
     public void visitConElementB(ConElementB conElementB) {
      String value = conElementB.value;
      conElementB.operation();
            //do something
     }
    }

    class ConVisitor2 implements Visitor{
     public void visitConElementA(ConElementA conElementA) {
      String value = conElementA.value;
      conElementA.operation();
            //do something
     }
     public void visitConElementB(ConElementB conElementB) {
      String value = conElementB.value;
      conElementB.operation();
            //do something
     }
    }

    interface Element {
     void accept(Visitor visitor);
    }

    class ConElementA implements Element {
     String value = "aa";
     
     public void operation() {}
     
     public void accept(Visitor visitor) {
      visitor.visitConElementA(this);
     }
    }

    class ConElementB implements Element {
     String value = "bb";
     
     public void operation() {}
     
     public void accept(Visitor visitor) {
      visitor.visitConElementB(this);
     }
    }

    class ObjectStructure {
     private List Elements = new ArrayList();
     
     public void action(Visitor visitor) {
      Iterator it = Elements.iterator();
      Element element = null;
      while (it.hasNext()) {
       element = (Element) it.next();
       element.accept(visitor);
      }
     }
     
     public void add(Element element) {
      Elements.add(element);
     } 
    }

    public class VisitorPattern {
     public static void main(String[] args) {
      ObjectStructure objs = new ObjectStructure();
      objs.add(new ConElementA());
      objs.add(new ConElementA());
      objs.add(new ConElementB());
      objs.action(new ConVisitor1());
     }
    }


    ***********************************************************************


    //Observer模式例子

    package pattern.c.observable;
    import java.util.*;

    class State {}

    interface Subject {
     void attach(Observer observer);
     
     void detach(Observer observer);
     
     void myNotify();
     
     State getState();
     
     void setState(State state);
    }

    class ConSubject implements Subject {
     List observers = new ArrayList();
     State state = new State();
     
     public void attach(Observer observer) {
      observers.add(observer);
     }
     
     public void detach(Observer observer) {
      observers.remove(observer);
     }
     
     public void myNotify() {
      Iterator it = observers.iterator();
      Observer observer = null;
      while (it.hasNext()) {
       observer = (Observer) it.next();
       observer.update();
      }
     }
     
     public State getState() {
      return state;
     }
     
     public void setState(State state) {
      this.state = state;
     } 
    }

    interface Observer {
     void update();
    }

    class ConObserver1 implements Observer{
     private Subject subject;
     
     public ConObserver1(Subject subject) {
      this.subject = subject;
     }
     
     public void update() {
      State state = subject.getState();
      // do something with state
     }
    }

    class ConObserver2 implements Observer{
     private Subject subject;
     
     public ConObserver2(Subject subject) {
      this.subject = subject;
     }
     
     public void update() {
      State state = subject.getState();
      // do something with state
     }
    }

    public class ObservablePattern {
     public static void main(String[] args) {
     }
    }


    ***********************************************************************


    //Mediator模式例子

    package pattern.c.mediator;

    public interface Colleague {
       
        void setState(String state);
       
        String getState();
       
        void change();
       
        void action();
       
    }

    package pattern.c.mediator;

    public class ConColleague1 implements Colleague {
       
        private String state = null;
        private Mediator mediator;
       
        public void change() {
            mediator.changeCol1();
        }
       
        public ConColleague1 (Mediator mediator) {
            this.mediator = mediator;
        }
       
        public void setState(String state) {
            this.state = state;
        }
       
        public String getState() {
            return state;
        }
       
        public void action() {
            System.out.println("this 2 and the state is " + state);
        }
    }

    package pattern.c.mediator;

    public class ConColleague2 implements Colleague {
       
        private String state = null;
        private Mediator mediator;
       
        public ConColleague2 (Mediator mediator) {
            this.mediator = mediator;
        }   
       
        public void change() {
            mediator.changeCol2();
        }   
       
        public void setState(String state) {
            this.state = state;
        }
       
        public String getState() {
            return state;
        }
       
        public void action() {
            System.out.println("this 1 and the state is " + state);
        }   
    }

    package pattern.c.mediator;

    public class ConMediator implements Mediator {
       
        private ConColleague1 con1;
        private ConColleague2 con2;
       
        public void setCon1(ConColleague1 con1) {
            this.con1 = con1;
        }
       
        public void setCon2(ConColleague2 con2) {
            this.con2 = con2;
        }
       
        public void changeCol1() {
            String state = con1.getState();
            con2.setState(state);
            con2.action();
        }
       
        public void changeCol2() {
            String state = con2.getState();
            con1.setState(state);
            con1.action();       
        }
       
    }

    package pattern.c.mediator;

    public interface Mediator {
       
        void setCon1(ConColleague1 con1);
       
        void setCon2(ConColleague2 con2);
       
        void changeCol1();
       
        void changeCol2();
       
    }

    package pattern.c.mediator;

    public class MediatorTest {
       
        public static void main(String[] args) {
            Mediator mediator = new ConMediator();
           
            ConColleague1 col1 = new ConColleague1(mediator);
            col1.setState("lq test in the MediatorTest main 18");
            ConColleague2 col2 = new ConColleague2(mediator);
           
            mediator.setCon1(col1);
            mediator.setCon2(col2);
           
            col1.change();
        }
       
    }

    ***********************************************************************


    //Iterator模式例子

    package pattern.c.iterator;

    interface Aggregate {
     MyIterator Iterator();
    }

    class ConAggregate {
     public MyIterator Iterator() {
      return new ConMyIterator();
     }
    }

    interface MyIterator {
     Object First();
     Object Last();
     boolean hasNext();
     Object Next();
    }

    class ConMyIterator implements MyIterator{
     Object[] objs = new Object[100];
     int index = 0;
     
     public Object First() {
      index = 0;
      return objs[index];
     }
     
     public Object Last() {
      index = objs.length - 1;
      return objs[index];
     }
     
     public boolean hasNext() {
      return index < objs.length;
     }
     
     public Object Next() {
      if (index == objs.length - 1) {
       return null;
      } else {
       return objs[++index];
      }
     }
    }

    public class IteratorPattern {

     public static void main(String[] args) {
     }
    }


    ***********************************************************************


    // Template Method 模式例子

    package pattern.c.template_method;

    abstract class father {
     abstract void med0();
     
     abstract void med1();
     
     //operation为一个模板方法
     public void operation() {
      med0();
      med1();
      // and other logic
     }
    }

    class child extends father {
     public void med0() {
      System.out.println("the med0 method");
     }
     
     public void med1() {
      System.out.println("the med1 method");
     }
    }

    public class TemplateMethodPattern {

     public static void main(String[] args) {
     }
    }


    ***********************************************************************


    //Chain of Responsiblity模式例子
    //将请求在链上传递
    //如果是当前节点的请求就结束传递处理请求否则向下传递请求
    //每个节点有另一个节点的引用 实现链状结构


    package pattern.c.chain_of_responsiblity;

    interface Handler{
     void handleRequest(int key);
    }

    class ConHandler1 implements Handler {
     private Handler handler;
     
     public ConHandler1(Handler handler) {
      this.handler = handler;
     }
     
     public void handleRequest(int key) {
      if (key == 1) {
       System.out.println("handle in 1");
       //handle something
      } else {
       handler.handleRequest(key);
      }
     }
    }

    class ConHandler2 implements Handler {
     private Handler handler;
     
     public ConHandler2(Handler handler) {
      this.handler = handler;
     }
     
     public void handleRequest(int key) {
      if (key == 2) {
       System.out.println("handle in 2");
       //handle something
      } else {
       handler.handleRequest(key);
      }
     }
    }

    class ConHandler3 implements Handler {
     private Handler handler;
     
     public ConHandler3(Handler handler) {
      this.handler = handler;
     }
     
     public void handleRequest(int key) {
      if (key == 3) {
       System.out.println("handle in 3");
       //handle something
      } else {
       handler.handleRequest(key);
      }
     }
    }

    public class ChainOfResponsiblityPattern {
     public static void main(String[] args) {
      Handler handler = new ConHandler2(new ConHandler1(new ConHandler3(null)));
      handler.handleRequest(3);
     }
    }

    ***********************************************************************

    //Interpreter模式例子
    /*
     * Variable 表示变量 存储在上下文中
     * Constant 终结表达式
     * And 与的关系 双目
     * Not 反的关系 单目
     */

    package pattern.c.interpreter;

    import java.util.*;

    class Context {
        private Map variables = new HashMap();
       
        public boolean lookUp(Variable name) {
            Boolean value = (Boolean) variables.get(name);
            if (value == null) {
                return false;
            }
            return value.booleanValue();
        }
       
        public void bind(Variable name, boolean value) {
            variables.put(name, new Boolean(value));
        }
    }

    interface Expression {
        boolean interpret(Context cont);
    }

    class Constant implements Expression {
        private boolean value;
       
        public Constant(boolean value) {
            this.value = value;
        }
       
        public boolean interpret(Context cont) {
            return value;
        }
    }

    class Variable implements Expression{
        private String name;
       
        public Variable(String name) {
            this.name = name;
        }
       
        public boolean interpret(Context cont) {
            return cont.lookUp(this);
        }
    }

    class And implements Expression {
        private Expression left;
        private Expression right;
       
        public And(Expression left, Expression right) {
            this.left = left;
            this.right = right;
        }
       
        public boolean interpret(Context cont) {
            return left.interpret(cont) && right.interpret(cont);
        }
    }

    class Not implements Expression {
        private Expression expression;
       
        public Not(Expression expression) {
            this.expression = expression;
        }
       
        public boolean interpret(Context cont) {
            return ! expression.interpret(cont);
        }
    }

    public class InterpreterPattern {
        public static void main(String[] args) {
            Context cont = new Context();
            Variable variable = new Variable("parameter1");
            cont.bind(variable, true);
            Expression and = new And(new Not(new Constant(true)), new And(new Constant(false), new Variable("parameter1")));
            //  (!(true)) && ((false)&&(true))
            and.interpret(cont);
        }
    }


    ***********************************************************************


    //Memento模式例子

    package pattern.c.memento;

    class Memento {
        String value1;
        int value2;
       
        public Memento(String value1, int value2) {
            this.value1 = value1;
            this.value2 = value2;
        }
    }

    class Originator {
        private String value1;
        private int value2;
       
        public Originator(String value1, int value2) {
            this.value1 = value1;
            this.value2 = value2;
        }
       
        public void setMemento(Memento memento) {
            value1 = memento.value1;
            value2 = memento.value2;
        }
       
        public Memento createMemento() {
            Memento memento = new Memento(value1, value2);
            return memento;
        }
     
        public void setValue1(String value1) {
            this.value1 = value1;
        }
     
        public void setValue2(int value2) {
            this.value2 = value2;
        }
    }

    class CareTaker {
        private Memento memento;
       
        public Memento retrieveMemento() {
            return memento;
        }
       
        public void saveMemento(Memento memento) {
            this.memento = memento;
        }
    }

    public class MementoPattern {
        public static void main(String[] args) {
            Originator originator = new Originator("test1", 1);
            CareTaker careTaker = new CareTaker();
           
            //保存状态
            careTaker.saveMemento(originator.createMemento());
           
            originator.setValue1("test2");
            originator.setValue2(2);
           
            //恢复状态
            originator.setMemento(careTaker.retrieveMemento());
        }
    }


    ***********************************************************************

  • 相关阅读:
    shell脚本中生成延时
    linux小技巧
    自定义微信圈分享带的图片和内容
    OOM killer
    svn报错
    Fatal error: Call-time pass-by-reference has been removed
    ThinkPHP3.1.3源码分析---php文件压缩zlib.output_compression 和 ob_gzhandler
    确保 PHP 应用程序的安全
    判断来自电脑还是手机
    以About Us为范例在Zen cart中增加页面
  • 原文地址:https://www.cnblogs.com/freeliver54/p/2540039.html
Copyright © 2020-2023  润新知