天天看点

设计模式java语言描述

单例模式:

方式一:

public class Singleton

{

   private static Singleton singleton;

   private Singleton() //防止从外部 new Singleton();

   {}

   public static Singleton getInstance()

   {

       if(singleton == null)

       {

           singleton = new Singleton();

       }

       return singleton;

   }

}

方式二:

   private static Singleton singleton = new Singleton();

   private Singleton(){}

简单工厂模式

public class OperationFactory

   public static Operation createOperation(char op)

       Operation operation = null;

       switch(op)

       case'+':

           operation =new OperationAdd();

           break;

       case'-':

           operation =new OperationSub();

       case'*':

           operation =new OperationMul();

       case'/':

           operation =new OperationDiv();

       return operation;

工厂方法模式

IFactory factory = new UndergraduateFactory();

LeiFeng stu = factory.CreateLeiFeng();

public interface IFactory

   LeiFeng CreateLeiFeng();

class UndergraduateFactory implements IFactory

   @Override

   public LeiFeng CreateLeiFeng()

       return new Undergraduate();

       //Undergraduate ex

class VolunteerFactory implements IFactory

       return new Volunteer();

class LeiFeng{....}

class Undergraduate extends LeiFeng

  // String    name = "student1";

class Volunteer extends LeiFeng

  //

Creator creator = new ConcreteCreator();

Product product = creator.createProduct(ConcreteProduct1.class);

public abstract class Creator

   public abstract Product createProduct(Class<? extends Product> c);

抽象工厂模式

建造者模式

public class Director

   public void Construct(Builder builder)

       builder.BuildPartA();

       builder.BuildPartB();

abstract class Builder

   public abstract void BuildPartA();

   public abstract void BuildPartB();

   public abstract Product GetResult();

Director director = new Director();

Builder b1 = new ConcreteBuilder1();

Builder b2 = new ConcreteBuilder2();

director.Construct(b1);

Product p1 = b1.GetResult();

p1.Show();

director.Construct(b2);

Product p2 = b2.GetResult();

p2.Show();

原型模式  ---较少使用,clone()方法有风险

abstract class Prototype

   private String id;

   public Prototype(String id)

       this.id = id;

   public String getId()

       return id;

   //抽象类关键就是这样一个Clone方法

   public abstract Prototype Clone();

class ConcretePrototype1 extends Prototype

   public ConcretePrototype1(String id)

       super(id);    

   public Prototype Clone()  

       // TODO Auto-generated method stub

       return (Prototype)this;

ConcretePrototype1 c1 = new ConcretePrototype1("wangmeng");

ConcretePrototype1 c2 = (ConcretePrototype1)c1.Clone();

Prototype c1 = new ConcretePrototype1("wangmeng");

Prototype c2 = (ConcretePrototype1)c1.Clone();

适配器模式

public interface Target  //目标接口

   public void Request();

public class Adaptee //被适配者

   public void SpecificRequest()  //原有方法

       System.out.println("目标方法");

//采用继承方式,

public class Adapter extends Adaptee implements Target

   public void Request() //将原有方法的调用转换为目标方法的调用

       this.SpecificRequest();

class Target

 public void Request()

 {

     System.out.println("Common request...");

 }

/**采取对象组合的的方式(推荐)*/

public class Adapter extends Target

   private Adaptee adaptee = new Adaptee();

   public void Request()

       adaptee.SpecificRequest();

桥梁模式:

Abstraction ab = new RefinedAbstraction();

ab.setImplementor(new ConcreteImplementorA());

ab.Operation();

ab.setImplementor(new ConcreteImplementorB());

abstract class Abstraction

   Implementor implementor;

   public void setImplementor(Implementor imp)

       this.implementor = imp;

   public abstract void Operation();

class RefinedAbstraction extends Abstraction

   public void Operation()//实现部分被抽象部分调用,用来完成抽象部分的功能

       implementor.OperationImp();

//关于Implementor

abstract class Implementor

   public abstract void OperationImp();

class ConcreteImplementorA extends Implementor

   public void OperationImp()

       System.out.println("ConcreteImplementorA_opreration");    

   }    

class ConcreteImplementorB extends Implementor

       System.out.println("ConcreteImplementorB_opreration");

组合模式:

Composite root = new Composite("root");

root.Add(new Leaf("Leaf A"));

root.Add(new Leaf("Leaf B"));

Composite comp1 = new Composite("comp1");

comp1.Add(new Leaf("comp1_Leaf A"));

comp1.Add(new Leaf("comp1_Leaf B"));        

root.Add(comp1);

Composite comp2 = new Composite("comp2");

comp2.Add(new Leaf("comp2_Leaf A"));

comp2.Add(new Leaf("comp2_Leaf B"));

root.Add(comp2);

root.Add(new Leaf("Leaf C"));

Leaf leaf = new Leaf("Leaf D");

root.Add(leaf);

//root.Remove(leaf);

root.Display(1);

方式一:Component接口的最大化,达到枝与叶没有区别,但安全性低

/**

* Component类:是组合中的对象声明接口

* 在适当情况下,实现所有类共有接口的默认行为。

* 声明一个接口,用于访问和管理Component的子部件

* */

abstract class Component //也可以定义成接口,提供对子对象的管理方法(添加、删除等)

   protected String name;

   public Component(String name)

       this.name = name;

   public abstract void Add(Component comp);

   public abstract void Remove(Component comp);

   public abstract void Display(int depth);

public class Composite implements Component

   private List<Component> list = new ArrayList<Component>();

   ...

public class Leaf implements Component

方式二:只在Composite中声明管理子类的方法

public interface Component  //根

   void doSomething();

public class Composite implements Component  //枝

   public void add(Component component)

       list.add(component);

   public List<Component> getAll()

       return this.list;

   public void doSomething()

       for(Component component : list)

           component.doSomething();

public class Leaf implements Component //叶

       System.out.println("Execute method...");

装饰模式

动态地给一个对象添加一些额外的职责。

优点:把类中的装饰功能从类中搬移出去,这样可以简化原有的类。

有效地把类的核心功能和装饰功能区分开了。

ConcreteComponent c = new ConcreteComponent();

ConcreteDecoratorA d1 = new ConcreteDecoratorA();

ConcreteDecoratorB d2 = new ConcreteDecoratorB();

d1.SetComponent(c);

d1.Operation();

d2.SetComponent(c);

d2.Operation();

Component定义了一个对象接口,可以给这些对象动态地添加职责。

ComcreteComponent定了一个具体的对象,也可以给这个具体的对象添加职责。

Decorator抽象装饰类,继承了Component对象接口,从外类扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在。

ConcreteDecoratorA具体的装饰对象,起到给Component添加职责的功能。

ConcreteDecoratorB具体的装饰对象,起到给Component添加职责的功能。

abstract class Component  

class ConcreteComponent extends Component

   public void Operation()

       System.out.println("Concrete Object Operation.");    

abstract class Decorator extends Component

   protected Component component;

   public void SetComponent(Component component)

       this.component = component;

       if(component != null)

           component.Operation();

       }        

class ConcreteDecoratorA extends Decorator

   private String addState;

       super.Operation();

       addState = "New State";

       System.out.println("Operations of ConcreteDecoratorA");

class ConcreteDecoratorB extends Decorator

{    

   private void AddedBehavior()

   {    

       AddedBehavior();

       System.out.println("Operations of ConcreteDecoratorB");

门面模式(外观模式)

为子系统中的一组接口,提供一个一致的界面

门面(Facade)角色:被客户端调用。此角色知晓相关的(一个或者多个)子系统的功能和责任,内部根据客户角色已有需求预定义了几种功能的组合

子系统(subsystem)角色:子系统并不知道门面的存在

Facade facade = new Facade();        

facade.Method1();

facade.Method2();

//由于Facade的作用,客户端可以根本不知道四个子系统的存在

public class Facade

   SubSystemA a;

   SubSystemB b;

   SubSystemC c;

   SubSystemD d;

   public Facade()

       a = new SubSystemA();

       b = new SubSystemB();

       c = new SubSystemC();

       d = new SubSystemD();

   public void Method1()

       System.out.println("Method1()");

       a.MethodA();

       b.MethodB();

       c.MethodC();

   public void Method2()

       System.out.println("Method2()");

       d.MethodD();

class SubSystemA

   public void MethodA()

       System.out.println("SubSystemA_MethodA");

class SubSystemB

   public void MethodB()

       System.out.println("SubSystemB_MethodB");

class SubSystemC

   public void MethodC()

       System.out.println("SubSystemC_MethodC");

class SubSystemD

   public void MethodD()

       System.out.println("SubSystemD_MethodD");

享元模式 //?

采用一个共享类来避免大量拥有相同内容的"小类"的开销

享元对象的优点:减少对象数量,节省内存空间。

享元模式的缺点:维护共享对象,需要额外的开销(用一个线程来维护垃圾回收)。

享元模式的本质:分离与共享。

何时使用享元对象:

● 如果一个应用程序使用了大量的细粒度对象,可以使用享元模式来减少对象数量。

● 如果使用大量的对象,造成很大的存储开销,可以使用享元模式来减少对象数量,并节约内存。

● 如果对象的大多数状态都可以转变为外部状态,可以使用享元对象来实现外部状态与内部状态的分离。

◆ Flyweight :享元接口,通过这个接口可以接受并作用于外部状态。通过这个接口传入外部的状态。

◆ ConcreteFlyweight :具体的享元实现对象,必须是可共享的,需要封装享元对象的内部状态。

◆ UnsharedConcreteFlyweight :非共享的享元实现对象,并不是所有的享元对象都可以共享,非共享的享元对象通常是享元对象的组合对象。

◆ FlyweightFactory :享元工厂,主要用来创建并管理共享的享元对象,并对外提供访问共享享元的接口。通常实现为单例

代理模式

Proxy proxy = new Proxy();

proxy.Request();  //实际执行的是RealSubject的Request()

abstract class Subject

   public abstract void Request();

public class RealSubject extends Subject

       System.out.println("Real Request...");

public class Proxy extends Subject

   RealSubject realSubject;

       if(realSubject == null)

           realSubject = new RealSubject();

       realSubject.Request();

职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

public class Client

   public static void main(String[] args)

        Handler h1 = new ConcreteHandler1();

        Handler h2 = new ConcreteHandler2();

        Handler h3 = new ConcreteHandler3();

        h1.setSuccessor(h2);

        h2.setSuccessor(h3);

        int[] requests = {2, 5, 14, 22 ,18};

        for(int req : requests)

        {

            h1.HandleRequest(req);

        }

abstract class Handler

   protected Handler successor;

   public void setSuccessor(Handler successor)

       this.successor = successor;

   public abstract void HandleRequest(int request);

class ConcreteHandler1 extends Handler

   public void HandleRequest(int request)

       if(request >= 0 && request < 10)

           System.out.printf("%s handle requests %d\n",this.getClass().getName(),request);

       else if(successor != null)

           successor.HandleRequest(request);

class ConcreteHandler2 extends Handler

       if(request >= 10 && request < 20)

class ConcreteHandler3 extends Handler

       if(request >= 20 && request < 30)

命令模式

Command:声明执行操作的接口

ConcreteCommand:将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现命令角色声明的执行操作的接口

Client:创建一个具体的命令对象,并可以设定它的接收者

Invoker:调用命令对象执行这个请求

Reciver:实施和执行一个请求相关的操作

       Reciver reciver = new Reciver();  

       Command command = new ConcreteCommand(reciver);

       Invoker invoker = new Invoker(command);

       invoker.doInvokerAction();

public interface Command

   void execute();//public is default

public class ConcreteCommand implements Command

   private Reciver reciver;

   public ConcreteCommand(Reciver reciver)

       this.reciver = reciver;

   public void execute()

       reciver.doAction();

public class Reciver

   public void doAction()

       System.out.println("Execute Action.");

//请求者

public class Invoker

   private Command command;

   public Invoker(Command command)

       this.command = command;

   public void doInvokerAction()

       command.execute();

       Reciver reciver = new Reciver();

       Invoker invoker = new Invoker();

       invoker.SetCommand(command);

       invoker.ExcuteCommand();

//Command:用来声明执行操作的接口

public abstract class Command

   protected Reciver reciver;

   public Command(Reciver reciver)

   abstract public void Execute();

* ConcreteCommand类,将一个接收者对象绑定于一个动作

* 调用接收者相应的操作,以实现Execute()方法

public class ConcreteCommand extends Command

       super(reciver);

   public void Execute()

       reciver.Action();

* Invoker类,要求该命令执行这个请求

   public void SetCommand(Command command)

   public void ExcuteCommand()

       command.Execute();

解释器模式  --很少用到

       Context context = new Context();

       List<AbstractExpression> list = new ArrayList<AbstractExpression>();

       list.add(new TerminalExpression());

       list.add(new NonterminalExpression());

       for(AbstractExpression exp : list)

           exp.interpret(context);

迭代器模式:

提供一种方法访问一个容器(container)对象中各个元素,而又不需要暴露该对象的内部细节

Iterator

ConcreteIterator

Aggregate

ConcreteAggregate

* 定义开始对象、下一个对象、

* 判断是否到达结尾、当前对象等方法

abstract class Iterator

   public abstract Object first();

   public abstract Object next();

   public abstract Boolean isDone();

   public abstract Object currentItem();

public class ConcreteIterator extends Iterator

   private ConcreteAggregate aggregate;

   private int current = 0; //记录遍历的当前位置

   public ConcreteIterator(ConcreteAggregate aggregate)

       this.aggregate = aggregate;

   public Object first()

       return aggregate.getItem(0);

   public Object next()

       Object ret = null;

       current++;

       if(current < aggregate.geCount())

           ret = aggregate.getItem(current);

       return ret;

   public Boolean isDone()

       return current >= aggregate.geCount()?true:false;

   public Object currentItem()

       return aggregate.getItem(current);

abstract class Aggregate

   public abstract Iterator createIterator();

public class ConcreteAggregate extends Aggregate

   private List<Object> items = new ArrayList<Object>();

   private Object item;

   public Iterator createIterator()

       return new ConcreteIterator(this);

   public int geCount()

       return items.size();

   public Object getItem(int index)

       return items.get(index);

   public void addItem(Object item,int index)

       items.add(index,item);

调停者模式(中介者模式 或 传递器模式)

abstract class Mediator

  public abstract void send(String message,Colleague colleague);

class ConcreteMediator extends Mediator

   private ConcreteColleague1 colleague1;

   private ConcreteColleague2 colleague2;

   public void setColleague1(ConcreteColleague1 colleague1)

       this.colleague1 = colleague1;

   public void setColleague2(ConcreteColleague2 colleague2)

       this.colleague2 = colleague2;

   public void send(String message, Colleague colleague)

       if(colleague1 == colleague)

           colleague2.msgNotify(message);

       else

           colleague1.msgNotify(message);

abstract class Colleague

   protected Mediator mediator;

   public Colleague(Mediator mediator)

       this.mediator = mediator;

class ConcreteColleague1 extends Colleague

   public ConcreteColleague1(Mediator mediator)

       super(mediator);

   public void send(String message)

       mediator.send(message,this);

   public void msgNotify(String message)

       System.out.println("ConcreteColleague1 receive message:"+message);

class ConcreteColleague2 extends Colleague

   public ConcreteColleague2(Mediator mediator)

       System.out.println("ConcreteColleague2 receive message:"+message);

       ConcreteMediator m = new ConcreteMediator();

       ConcreteColleague1 c1 = new ConcreteColleague1(m);

       ConcreteColleague2 c2 = new ConcreteColleague2(m);

       m.setColleague1(c1);

       m.setColleague2(c2);

       c1.send("Have you eat?");

       c2.send("Not yet! Your treat?");

备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态。并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态

Memento:存储一个Originator的内部状态

Originator:创建一个备忘录,用来记录当前时刻它的内部状态,在需要时使用备忘录恢复内部状态

Caretaker:负责保存好备忘录,不能对备忘录的内部进行操作

public class Memento

   private String state;

   public Memento(String state)

       this.state = state;

   public String getState()

       return state;

public class Originator

   private String state;//the attribute you need to save.maybe more than one.

   public void setState(String state)

   public Memento CreateMemento()//import the attribute and instance a Memento Object

       return new Memento(state);

   public void setMemento(Memento memento)//recovery the Memento,recovery relative data(attributes)

       state = memento.getState();

   public void show()

       System.out.println("state : " + state);

public class Caretaker

   private Memento memento;

   public Memento getMemento()

       return memento;

   public void setMemento(Memento memento)

       this.memento = memento;

        Originator originator = new Originator();

        originator.setState("On");

        originator.show();

        Caretaker care = new Caretaker();

        care.setMemento(originator.CreateMemento());

        originator.setState("Off");

        originator.setMemento(care.getMemento());

观察者模式

public class TestObserver

       ConcreteSubject s = new ConcreteSubject();

       ConcreteObserver x = new ConcreteObserver(s,"x");

       ConcreteObserver y = new ConcreteObserver(s,"y");

       ConcreteObserver z = new ConcreteObserver(s,"z");

       s.attach(x);

       s.attach(y);

       s.attach(z);

       s.setSubjectState("ABC");

       s.notifyObservers();

       s.detach(y);

       s.setSubjectState("dislike y");

       s.notifyObservers();        

* 抽象通知者,把所有对观察者对象的引用保存在一个聚集里

* 可以增加或移除观察者

   private List<Observer> observers = new ArrayList<Observer>();

   public void attach(Observer observer)

       observers.add(observer);

   public void detach(Observer observer)

       observers.remove(observer);

   public void notifyObservers()  

       for(Observer observer : observers)

           observer.update();

public class ConcreteSubject extends Subject

   private String subjectState;   //目标类的状态

   public String getSubjectState()

       return subjectState;

   public void setSubjectState(String subjectState)

       this.subjectState = subjectState;

* Observer类,抽象观察者,在得到主题的通知时更新自己

*

abstract class Observer

   public abstract void update();

public class ConcreteObserver extends Observer

   private String name;   //观察者的名称

   private String observerState;  //观察到的目标的状态,(作为自己的状态)

   private ConcreteSubject subject;  //所观察的目标对象

   public ConcreteObserver(ConcreteSubject subject,String name)

       this.subject = subject;

   public void update()

       observerState = subject.getSubjectState();

       System.out.println("The new state of Observer "+name+" observed is "+observerState);

   public ConcreteSubject getSubject()

       return subject;

   public void setSubject(ConcreteSubject subject)

策略模式

Context:策略的使用环境,

Strategy:定义所有具体策略角色所需的接口

ConcreteStrategy:实现Strategy

public class TestStrategy

       Context context = null;

       context = new Context(new ConcreteStrategyA());

       context.ContextInterface();

       context = new Context(new ConcreteStrategyB());

       context = new Context(new ConcreteStrategyC());

       context.ContextInterface();    

* Strategy类,定义了所有支持的算法的公共接口

//抽象算法类

abstract class Strategy

   //算法方法

   public abstract void AlgorithmInterface();

class  ConcreteStrategyA  extends  Strategy

   public void AlgorithmInterface()

       System.out.println("算法A实现");

class  ConcreteStrategyB  extends  Strategy

       System.out.println("算法B实现");

class  ConcreteStrategyC  extends  Strategy

       System.out.println("算法C实现");

class Context

   Strategy strategy;

   public Context(Strategy strategy)

       this.strategy = strategy;

   public void ContextInterface()

       this.strategy.AlgorithmInterface();

状态模式 --与策略模式类似

可以有效地替换充满在程序中的if else语句

Context:定义一个客户程序需要的接口,并定义一个状态实例,表示当前的状态

State:封装一个与环境角色特定状态相关的行为

ConcreteState:实现State

public class Context

   private State state;

   public Context(State state)

   public State getState()

       System.out.println("Current state is:"+state.getClass().getName());;

   public void setState(State state)

   public void request()

       state.Handle(this);

       this.getState();

abstract class State

   public abstract void Handle(Context context);

class ConcreteStateA extends State

   public void Handle(Context context)

       context.setState(new ConcreteStateB());        

class ConcreteStateB extends State

       context.setState(new ConcreteStateA());        

模板模式(模板方法模式)

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,这样子类也可以不改变算法骨架而重定义某些步骤

abstract class AbstractClass

   public abstract void PrimitiveOperation1();

   public abstract void PrimitiveOperation2();

   public void TemplateMethod()

       PrimitiveOperation1();

       PrimitiveOperation2();

       System.out.println();

class ConcreteClassA extends AbstractClass

   public void PrimitiveOperation1()

       System.out.println("ConcreteClassA_PrimitiveOperation1()");        

   public void PrimitiveOperation2()

       System.out.println("ConcreteClassA_PrimitiveOperation2()");        

class ConcreteClassB extends AbstractClass

       System.out.println("ConcreteClassB_PrimitiveOperation1()");        

       System.out.println("ConcreteClassB_PrimitiveOperation2()");        

public class TestTemplate

        AbstractClass c;

        c = new ConcreteClassA();

        c.TemplateMethod();

        c = new ConcreteClassB();

访问者模式

表示一个作用于某对象结构中的各元素的操作。

可以在不改变各元素的类的前提下,定义作用于这些元素的新操作

1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。

2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。

3) 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。

4) 具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。

5) 对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。

abstract class Visitor

   public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);

   public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);

class ConcreteVisitor1 extends Visitor

   public void visitConcreteElementA(ConcreteElementA concreteElementA)

       System.out.printf("%s is visited by %s\n",

               concreteElementA.getClass().getName(),this.getClass().getName());        

   public void visitConcreteElementB(ConcreteElementB concreteElementB)

           concreteElementB.getClass().getName(),this.getClass().getName());    

class ConcreteVisitor2 extends Visitor

           concreteElementB.getClass().getName(),this.getClass().getName());        

abstract class Element

   public abstract void accept(Visitor visitor);

class ConcreteElementA extends Element

   public void accept(Visitor visitor)

       visitor.visitConcreteElementA(this);

   public void operationA()

class ConcreteElementB extends Element

       visitor.visitConcreteElementB(this);

   public void operationB()

class ObjectStructure

   private List<Element> elements = new ArrayList<Element>();

   public void attach(Element element)

       elements.add(element);

   public void detach(Element element)

       elements.remove(element);

       for(Element e : elements)

           e.accept(visitor);

       ObjectStructure o = new ObjectStructure();

       o.attach(new ConcreteElementA());

       o.attach(new ConcreteElementB());

       ConcreteVisitor1 v1 = new ConcreteVisitor1();

       ConcreteVisitor2 v2 = new ConcreteVisitor2();

       o.accept(v1);

       o.accept(v2);