【网摘】Java设计模式

原文地址:
http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

设计模式六大原则:
1.开闭原则:对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有的代码。
2.里氏代换原则:任何基类可以出现的地方,子类一定可以出现。
3.依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体。
4.接口隔离原则:使用多个隔离的接口,比使用单个接口好。
5.迪米特法则:也叫最少知道原则,即一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6.合成复用原则:尽量使用合成/聚合的方式,而不是使用继承。
设计模式分类:
创建型模式:
工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式:
适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式
行为型模式:
策略模式,模版方法模式,观察这么是,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。
其他:并发型模式,线程池模式。

一、工厂方法模式
1.普通工厂模式

 

public interface Sender{
 public void Send();
}

public class MailSender implements Sender{
 @Override
 public void Send(){
  System.out.println("This is a mail sender!");
 }
} 

public class SmsSender implements Sender{
 @Override
 public void Send(){
  System.out.println("This is a sms sender!");
 }
}

public class SendFactory{
 public Sender produce(String type){
  if("mail".equals(type)){
   return new MailSender();
  }else if("sms".equals(type)){
   return new SmsSender();
  }else{
   System.out.println("请输入正确的类型!");
   return null;
  }
 }
}

public class FactoryTest{
 public static void main(String[] args){
  SendFacotry factory=new SendFactory();
  Sender sender=factory.produce("sms");
  sender.Send();
 }
}

2.多个工厂方法模式

对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象:

3.静态工厂方法模式

将上面的多个工厂方法模式里的方法置为静态,不需要创建实例,直接调用即可。

凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。

-------------------------------------------------------------------

二、抽象工厂模式

工厂方法模式有一个问题,就是类的创建依赖工厂类,如果想要扩展程序,必须对工厂类进行修改。抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

public interface Sender{
 public void Send();
}

public class MailSender implements Sender{
 @Override
 public void Send(){
  System.out.println("This is mail sender!");
 }
}

public class SmsSender implements Sender{
 @Override
 public void Send(){
  System.out.println("This is sms sender!");
 }
}

public interface Provider{
 public Sender produce();
}

public class SendMailFactory implements Provider{
 @Override
 public Sender produce(){
  return new MailSender();
 }
}

public class SendSmsFactory implements Provider{
 @Override
 public Sender produce(){
  return new SmsSender();
 }
}

public class Test{
 public static void main(String[] args){
  Provider provider=new SendMailFactory();
  Sender sender = provider.produce();
  sender.Send();
 }
}

--------------------------------------------------------------

三、单例模式 ?

在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:

1. 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的开销。

2. 省去了new操作符,降低了系统内存的使用率,减轻GC压力

3. 有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,好比一个军队不能出现多个司令指挥。

初步实现:

public class Singleton{
 /*持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载*/
 private static Singleton instance=null;
 /*私有构造方法,防止被实例化*/
 private Singleton(){}
 /*静态工程方法,创建实例*/
 public static Singleton getInstance(){
  if(instance==null){
   instance=new Singleton();
  }
  return instance;
 }
 /*如果该对象被用于序列化,可以保证对象在序列化前后保持一致*/
 public Object readResolve(){
  return instance;
 }
}
/*
*
*/

---------------------------------------------------------------------------------------

四、建造者模式

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。

public class Builder{
 private List<Sender> list = new ArrayList<Sender>();
 public void produceMailSender(int count){
  for(int i=0;i<count;i++){
   list.add(new MailSender());
  }
 }
 public void produceSmsSender(int count){
  for(int i=0;i<count;i++){
   list.add(new SmsSender());
  }
 }
}
public class Test{
 public static void main(String[] args){
  Builder builder=new Builder();
  builder.produceMailSender(10);
 }
}

-------------------------------------------------------------------

五、原型模式

该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

深复制:将一个对象复制后,不论是基本数据类型还是引用类型,都是重新创建的。

public class Prototype implements Cloneable,Serializable{
 private static final long serialVersionUID=1L;
 private String string;
 private SerializableObject obj;
 /*浅复制*/
 public Object clone() throws CloneNotSupportedException{
  Prototype proto=(Prototype)super.clone();
  return proto;
 }
 /*深复制*/
 public Object deepClone() throws IOException, ClassNotFoundException{
  /*写入当前对象的二进制流*/
  ByteArrayOutputStream bos=new ByteArrayOutputStream();
  ObjectOutputStream oos=new ObjectOutputStream(bos);
  oos.writeObject(this);
  /*读出二进制流产生的新对象*/
  ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
  ObjectInputStream ois=new ObjectInputStream(bis);
  return ois.readObject();
 }
 public String getString(){
  return string;
 }
 public void setString(String string){
  this.string=string;
 }
 public SerializableObject getObj(){
  return obj;
 }
 public void setObj(SerializableObject obj){
  this.obj=obj;
 }
}
class SerializableObject implements Serializable{
 private static final long serialVersionUID=1L;
}

---------------------------------------------------------------

六、适配器模式 ?

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

1. 类的适配器模式

 

public class Source{
 public void method1(){
  System.out.println("this is original method!");
 }
}
public interface Targetable{
 /*与原类中的方法相同*/
 public void method1();
 /*新类的方法*/
 public void method2();
}
public class Adapter extends Source implements Targetable{
 @Override
 public void method2(){
  System.out.println("this is the targetable method!");
 }
}
public class AdapterTest{
 public static void main(String[] args){
  Targetable target=new Adapter();
  target.method1();
  target.method2();
 }
}

2.对象的适配器模式

修改Adapter类:

public class Wrapper implements Targetable{
 private Source source;
 public Wrapper(Source source){
  super();
  this.source=source;
 }
 @Override
 public void method2(){
  System.out.println("this is the target method!");
 }
 @Override
 public void method1(){
  source.method1();
 }
}
public class AdapterTest{
 public static void main(String[] args){
  Source source=new Source();
  Targetable target=new Wrapper(source);
  target.method1();
  target.method2();
 }
}

3. 接口的适配器模式

 

public interface Sourceable{
 public void method1();
 public void method2();
}
public abstract class Wrapper2 implements Sourceable{
 public void method1(){}
 public void method2(){}
}
public class SourceSub1 extends Wrapper2{
 public void method1(){
  System.out.println("the sourceable interface‘s first Sub1!");
 }
}
public class SourceSub2 extends Wrapper2{
 public void method2(){
  System.out.println("the sourceable interface‘s second Sub2!");
 }
}
public class WrappterTest{
 public static void main(String[] args){
  Sourceable source1=new SourceSub1();
  Sourceable source2=new SourceSub2();
  source1.method1();
  source1.method2();
  source2.method1();
  source2.method2();
 }
}

三种适配器模式的应用场景:

类适配器:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

对象适配器:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

接口适配器:当不希望实现一个接口中的所有方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

------------------------------------------------------------------------------------------------------

七、装饰模式

装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

public interface Sourceable{
 public void method();
}
public class Source implements Sourceable{
 @Override
 public void method(){
  System.out.println("the original method!");
 }
}
public class Decorator implements Sourceable{
 private Sourceable source;
 public Decorator(Sourceable source){
  super();
  this.source=source;
 }
 @Override
 public void method(){
  System.out.println("before decorator!");
  source.method();
  System.out.println("after decorator!");
 }
}
public class DecoratorTest{
 public static void main(String[] args){
  Sourceable source=new Source();
  Sourceable obj=new Decorator(source);
  obj.method();
 }
}

应用场景:

1. 需要扩展一个类的功能。

2. 动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

缺点:产生过多相似的对象,不易排错。

------------------------------------------------------------------------

八、代理模式

代理模式就是多一个代理类出来,替原对象进行一些操作,与装饰者模式很像,但不同的是,代理模式直接在类中实例化出要操作的对象,进行间接使用。而装饰者模式是二者均存在,可以根据需求操作原对象,也可以操作装饰过的对象。

public interface Sourceable{
public void method();
}
public class Source implements Sourceable{
@Override
public void method(){
  System.out.println("the original method!");
}
}
public class Proxy implements Sourceable{
 private Source source;
 public Proxy(){
  super();
  this.source=new Source();
 }
 @Override
 public void method(){
  before();
  source.method();
  after();
 }
 private void before(){
  System.out.println("before proxy!");
 }
 private void after(){
  System.out.println("after proxy!");
 }
}
public class ProxyTest{
 public static void main(String[] args){
  Sourceable source=new Proxy();
  source.method();
 }
}

------------------------------------------------------------------------

九、外观模式

 

public class CPU{
 public void startup(){
  System.out.println("cpu startup!");
 }
 public void shutdown(){
  System.out.println("cpu shutdown!");
 }
}
public class Memory{
 public void startup(){
  System.out.println("memory startup!");
 }
 public void shutdown(){
  System.out.println("memory shutdown!");
 }
}
public class Disk{
 public void startup(){
  System.out.println("disk startup!");
 }
 public void shutdown(){
  System.out.println("disk shutdown!");
 }
}
public class Computer{
 private CPU cpu;
 private Memory memory;
 private Disk disk;
 public Computer(){
  cpu=new CPU();
  memory=new Memory();
  disk=new Disk();
 }
 public void startup(){
  System.out.println("start the computer!");
  cpu.startup();
  memory.startup();
  disk.startup();
  System.out.println("start computer finished!");
 }
 public void shutdown(){
  System.out.println("begin to close the computer!");
  cpu.shutdown();
  memory.shutdown();
  disk.shutdown();
  System.out.println("computer closed!");
 }
}
public class User{
 public static void main(String[] args){
  Computer computer=new Computer();
  computer.startup();
  computer.shutdown();
 }
}

-------------------------------------------------------------------------------------

十、桥接模式

把事物和具体实现分开,使他们各自独立的变化。例如JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码。

public interface Sourceable{
 public void method();
}
public class SourceSub1 implements Sourceable{
 @Override
 public void method(){
  System.out.println("This is the first sub!");
 }
}
public class SourceSub2 implements Sourceable{
 @Override
 public void method(){
  System.out.println("This is the second sub!");
 }
}
public abstract class Bridge{
 private Sourceable source;
 public void method(){
  source.method();
 }
 public Sourceable getSource(){
  return souce;
 }
 public void setSource(Sourceable source){
  this.source=source;
 }
}
public class MyBridge extends Bridge{
 public void method(){
  getSource().method();
 }
}
public class BridgeTest{
 public static void main(String[] args){
  Bridge bridge=new MyBridge();
  Sourceable source1=new SourceSub1();
  bridge.setSource(source1);
  bridge.method();
  Sourceable source2=new SourceSub2();
  bridge.setSource(source2);
  bridge.method();
 }
}

-------------------------------------------------------------------------------

十一、组合模式

又叫部分-整体模式,具体如下代码(不要当成真正的树数据结构)

public class TreeNode{
 private String name;
 private TreeNode parent;
 private Vector<TreeNode> children=new Vector<TreeNode>();
 public TreeNode(String name){
  this.name=name;
 }
 public String getName(){
  return name;
 }
 public void setName(String name){
  this.name=name;
 }
 public TreeNode getParent(){
  return parent;
 }
 public void setParent(TreeNode parent){
  this.parent=parent;
 }
 public void add(TreeNode node){
  children.add(node);
 }
 public void remove(Tree node){
  children.remove(node);
 }
 public Enumeration<TreeNode> getChildren(){
  return children.elements();
 }
}
public class Tree{
 TreeNode root=null;
 public Tree(String name){
  root=new TreeNode(name);
 }
 public static void main(String[] args){
  Tree tree=new Tree("A");
  TreeNode nodeB=new TreeNode("B");
  TreeNOde nodeC=new TreeNode("C");
  nodeB.add(nodeC);
  tree.root.add(nodeB);
  System.out.println("build the tree finished!");
 }
}

----------------------------------------------------------------------------------------------

十二、享元模式

----------------------------------------------------------------------------------------------

十三、策略模式

策略模式定义了一些列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

public interface ICalculator{
 public int calculate(String exp);
}
public abstract class AbstractCalculator{
 public int[] split(String exp,String opt){
  String array[]=exp.split(opt);
  int arrayInt[]=new int[2];
  arrayInt[0]=Integer.parseInt(array[0]);
  arrayInt[1]=Integer.parseInt(array[1]);
  return arrayInt;
 }
}
public class Plus extends AbstractCalculator implements ICalculator{
 @Override
 public int calculate(String exp){
  int arrayInt[]=split(exp,"\\+");
  return arrayInt[0]+arrayInt[1];
 }
}
public class Minus extends AbstractCalculator implements ICalculator{
 @Override
 public int calculate(String exp){
  int arrayInt[]=split(exp,"-");
  return arrayInt[0]-arrayInt[1];
 }
}
public class Multiply extends AbstractCalculator implements ICalculator{
 @Override
 public int calculate(String exp){
  int arrayInt[]=split(exp,"\\*");
  return arrayInt[0]*arrayInt[1];
 }
}
public class StrategyTest{
 public static void main(String[] args){
  String exp="2+8";
  ICalculator cal=new Plus();
  int result=cal.calculate(exp);
  System.out.println(result);
 }
}

------------------------------------------------------------------------------------------

十四、模板方法模式

public abstract class AbstractCalculator{
 public final int calculate(String exp,String opt){
  int array[]=split(exp,opt);
  return calculate(array[0],array[1]);
 }
 abstract public int calculate(int num1,int num2);
 public int[] split(String exp,String opt){
  String array[]=exp.split(opt);
  int arrayInt[]=new int[2];
  arrayInt[0]=Integer.parseInt(array[0]);
  arrayInt[1]=Integer.parseInt(array[1]);
  return arrayInt;
 }
}
public class Plus extends AbstractCalculator{
 @Override
 public int calculate(int num1,int num2){
  return num1+num2;
 }
}
public class StrategyTest{
 public static void main(String[] args){
  String exp="8+8";
  AbstractCalculator cal=new Plus();
  int result=cal.calculate(exp,"\\+");
  System.out.println(result);
 }
}

-------------------------------------------------------------------------------------

十五、观察者模式

类似于邮件订阅和RSS订阅,当你订阅了该文章,如果后续有更新,会及时通知你。简而言之,当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化。如下图:

MySubject类是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。实现代码如下:

//Observer接口
public interface Observer{
 public void update();
}
//两个实现类
public class Observer1 implements Observer{
 @Override
 public void update(){
  System.out.println("ovserver 1 has received!");
 }
}
 public class Observer2 implements Observer{
 @Override
 public void update(){
  System.out.println("observer 2 has received!");
 }
}
//Subject接口及实现类:
public interface Subject{
 public void add(Observer observer);
 public void del(Observer observer);
 public void notifyObservers();
 public void operation();
}
public abstract class AbstractSubject implements Subject{
 private Vector<Observer> vector=new Vector<Observer>();
 @Override
 public void add(Observer observer){
  vector.add(observer);
 }
 @Override
 public void del(Observer observer){
  vector.remove(observer);
 }
 @Override
 public void notifyObservers(){
  Enumeration<Observer> enumo=vector.elements();
  while(enumo.hasMoreElements()){
   enumo.nextElement().update();
  }
 }
}
public class MySubject extends AbstractSubject{
 @Override
 public  void operation(){
  System.out.println("update self!");
  notifyObservers();
 }
}
//测试类
public class ObserverTest{
 public static void main(String[] args){
  Subject sub=new MySubject();
  sub.add(new Observer1());
  sub.add(new Observer2());
  sub.operation();
 }
}

--------------------------------------------------------------------------------

十六、迭代器模式

迭代器模式就是顺序访问聚集中的对象。

public interface Collection{
 public Iterator iterator();
 public Object get(int i);
 public int size();
}
public interface Iterator{
 public Object previous();
 public Object next();
 public boolean hasNext();
 public Object first();
}
public class MyCollection implements Collection{
 public String string[]={"A","B","C","D","E"};
 @Override
 public Iterator iterator(){
  return new MyIterator(this);
 }
 @Override
 public Object get(int i){
  return string[i];
 }
 @Override
 public int size(){
  return string.length;
 }
}
public class MyIterator implements Iterator{
 private Collection collection;
 private int pos=-1;
 public MyIterator(Collection collection){
  this.collection=collection;
 }
 @Override
 public Object previous(){
  if(pos>0){
   pos--;
  }
  return collection.get(pos);
 }
 @Override
 public Object next(){
  if(pos<collection.size()-1){
   pos++;
  }
  return collection.get(pos);
 }
 @Override
 public boolean hasNext(){
  if(pos<collection.size()-1){
   return true;
  }else{
   return false;
  }
 }
 @Override
 public Object first(){
  pos=0;
  return collection.get(pos);
 }
}
public class Test{
 public static void main(String[] args){
  Collection collection=new MyCollection();
  Iterator it=collection.iterator();
  while(it.hasNext()){
   System.out.println(it.next());
  }
 }
}

-----------------------------------------------------------------------------------------

十七、责任链模式

public interface Handler{
 public void operator();
}
public abstract class AbstractHandler{
 private Handler handler;
 public Handler getHandler(){
  return handler;
 }
 public void setHandler(Handler handler){
  this.handler=handler;
 }
}
public class MyHandler extends Abstracthandler implements Handler{
 private String name;
 public MyHandler(String name){
  this.name=name;
 }
 @Override
 public void operator(){
  System.out.println(name+"deal!");
  if(getHandler()!=null){
   getHandler().operator();
  }
 }
}
public class Test{
 public static void main(String[] args){
  MyHandler h1=new MyHandler("h1");
  MyHandler h2=new MyHandler("h2");
  MyHandler h3=new MyHandler("h3");
  h1.setHandler(h2);
  h2.setHandler(h3);
  h1.operator();
 }
}

------------------------------------------------------------------------------------

十八、命令模式

命令模式类似于司令员下令让士兵去干事,司令只需要发出命令,口令经过传递到士兵,士兵去执行,三个过程互相解耦。

public interface Command{
 public void exec();
}
public class MyCommand implements Command{
 private Receiver receiver;
 public MyCommand(Receiver receiver){
  this.receiver=receiver;
 }
 @Override
 public void exec(){
  receiver.action();
 }
}
public class Receiver{
 public void action(){
  System.out.println("command received!");
 }
}
public class Invoker{
 private Command command;
 public Invoker(Command command){
  this.command=command;
 }
 public void action(){
  command.exec();
 }
}
public class Test{
 public static void main(String[] args){
  Receiver receiver=new Receiver();
  Command cmd=new MyCommand(receiver);
  Invoker invoker=new Invoker(cmd);
  invoker.action();
 }
}

-----------------------------------------------------------------------------------

十九、备忘录模式

主要目的是保存一个对象的某个状态,以便在适当的时候回复对象,也就是备份。

 

public class Original{
 private String value;
 public String getValue(){
  return value;
 }
 public void setValue(String value){
  this.value=value;
 }
 public Original(String value){
  this.value=value;
 }
 public Memento createMemento(){
  return new Memento(value);
 }
 public void restoreMemento(Memento memento){
  this.value=memento.getValue();
 }
}
public class Memento{
 private String value;
 public Memento(String value){
  this.value=value;
 }
 public String getValue(){
  return value;
 }
 public void setValue(String value){
  this.value=value;
 }
}
public class Storage{
 private Memento memento;
 public Storage(Memento memento){
  this.memento=memento;
 }
 public Memento getMemento(){
  return memento;
 }
 public void setMemento(Memento memento){
  this.memento=memento;
 }
}
public class Test{
 public static void main(String[] args){
  //创建原始类
  Original origi=new Original("egg‘);
  //创建备忘录
  Storage storage=new Storage(origi.createMemento());
  //修改原始类的状态
  System.out.println("初始化状态为:"+origi.getValue());
  origi.setValue("niu");
  System.out.println("修改后的状态为:"+rigi.getValue());
  //回复原始类的状态
  origi.restoreMemento(storage.getMemento());
  System.out.println("恢复后的状态为:"+origi.getValue());
 }
}

------------------------------------------------------------------------------------------

二十、状态模式

当对象的状态改变时,同时改变其行为

public class State{
 private String value;
 public String getValue(){
  return value;
 }
 public void setValue(String value){
  this.value=value;
 }
 public void method1(){
  System.out.println("execute the first opt!");
 }
 public void method2(){
  System.out.println("execute the second opt!");
 }
}
public class Context{
 private State state;
 public Context(State state){
  this.state=state;
 }
 public State getState(){
  return state;
 }
 public void setState(State state){
  this.state=state;
 }
 public void method(){
  if(state.getValue().equals("state1")){
   state.method1();
  }else if(state.getValue().equals("state2")){
   state.method2();
  }
 }
}
public class Test{
 public static void main(String[] args){
  State state=new State();
  Context context=new Context(state);
  //设置第一种状态
  state.setValue("state1");
  context.method();
  //设置第二种状态
  state.setValue("state2");
  context.method();
 }
}

也就是设置一个状态类,声明状态值以及各种状态下的方法,再将此类应用到其他类中。(不过更好的方法大概应该是把状态值和方法分开吧?)

-------------------------------------------------------------------------------------------------

二十一、访问者模式??

 

下面这段代码看起来很普通,就是写了两个接口及两个接口实现类然后调用一下,不造跟这个访问者模式有什么关系

public interface Visitor{
 public void visit(Subject sub);
}
public class MyVisitor implements Visitor{
 @Override
 public void visit(Subject sub){
  System.out.println("visit the subject: "+sub.getSubject());
 }
}
public interface Subject{
 public void accept(Visitor visitor);
 public String getSubject();
}
public class MySubject implements Subject{
 @Override
 public void accept(Visitor visitor){
  visitor.visit(this);
 }
 @Override
 public String getSubject(){
  return "love";
 }
}
public class Test{
 public static void main(String[] args){
  Visitor visitor=new MyVisitor();
  Subject sub=new MySubject();
  sub.accept(visitor);
 }
}

--------------------------------------------------------------------------------------

二十二、中介者模式???

public interface Mediator{
 public void createMediator();
 public void workAll();
}
public class MyMediator implements Mediator{
 private User user1;
 private User user2;
 public User getUser1(){
  return user1;
 }
 public User getUser2(){
  return user2;
 }
 @Override
 public void createMediator(){
  user1=new User1(this);
  user2=new User2(this);
 }
 @Override
 public void workAll(){
  user1.work();
  user2.work();
 }
}
public abstract class User{
 private Mediator mediator;
 public Mediator getMediator(){
  return mediator;
 }
 public User(Mediator mediator){
  this.mediator=mediator;
 }
 public abstract void work();
}
public class User1 extends User{
 public User1(Mediator mediator){
  super(mediator);
 }
 @Override
 public void work(){
  System.out.println("user1 exe!");
 }
}
public class User2 extends User{
 public User2(Mediator mediator){
  super(mediator);
 }
 @Override
 public void work(){
  System.out.println("user2 exe!");
 }
}
public class Test{
 public static void main(String[] args){
  Mediator mediator=new MyMediator();
  mediator.createMediator();
  mediator.workAll();
 }
}

--------------------------------------------------------------------------------------------

二十三、解释器模式???

public interface Expression{
 public int interpret(Context context);
}
public class Plus implements Expression{
 @Override
 public int interpret(Context context){
  return context.getNum1()+context.getNum2();
 }
}
public class Minus implements Expression{
 @Override
 public int interpret(Context context){
  return context.getNum1()-context.getNum2();
 }
}
public class Context{
 private int num1;
 private int num2;
 public Context(int num1,int num2){
  this.num1=num1;
  this.num2=num2;
 }
 public int getNum1(){
  return num1;
 }
 public void setNum1(int num1){
  this.num1=num1;
 }
 public getNum2(){
  return num2;
 }
public class Test{
 public static void main(String[] args){
  //计算9+8-2
  int result=new Minus().interpret((new Context(new Plus().interpret(new Context(9,2)),8)));
  System.out.println(result);
 }
}
时间: 2024-08-25 10:42:49

【网摘】Java设计模式的相关文章

java --- 设计模式 --- 动态代理

Java设计模式——动态代理 java提供了动态代理的对象,本文主要探究它的实现, 动态代理是AOP(面向切面编程, Aspect Oriented Programming)的基础实现方式, 动态代理使代码的重复更少,更便与维护 本文参考了满一行老师和马士兵老师的视频,在此表示Thanks. 假设小张通过QQ和一个网名为如花的妹纸聊天, 而在QQ的另一端,这个网名为如花的妹纸的name是小丽 但是,正在聊天的时候小丽生病了不想打字,小丽就找她的男朋友帮忙回应 小丽的男朋友在如花的QQ账号上与小张

【摘】设计模式入门指南

设计模式入门指南 想知道设计模式是什么?在这篇文章中,我会解释为什么设计模式重要.我也会提供一些PHP的例子来解释什么时候什么情况下来使用设计模式. 什么是设计模式? 设 计模式是针对我们日常编程问题的经过优化的可重用的方法.一种设计模式不仅仅是可以简单集成到系统中的一个类或者一个库.它是一个只能在正确的情境下使用 的模板.它也不是只针对某种语言.一个好的设计模式应该可以适用于绝大多数语言中,同时也要依赖于语言的特性.最重要的是,任何设计模式如果用错地方的 话,就有可能变成一把双刃剑,它可以是灾

【Java设计模式】1.单例模式

写在前面 Java设计模式总共有23种,虽然我也没仔细数.单例模式,好像在常用的Java项目中必不可少吧,好比是做米饭绝对少不了米,没毛病.这里谈谈自己的理解吧,大致分为几个方面: 1.哪些时候需要用到单例模式,即单例模式的使用场景,谈谈Singleton Mode的概念 2.常见有哪几种单例模式 3.单例模式的好处 4.单例模式和线程安全的那些事儿 1.0 什么时候需要单例模式 1.1 定义 单例模式,是一种创建对象的设计模式,单例模式确保其某一个类只有一个实例,即:它要确保整个类有且只有一个

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage

Java设计模式(二)-单例模式

单例模式建议保证某个对象仅仅只有一个实例,当只有一个对象来协调整个系统的操作时,在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例,总之,选择单例模式就是为了避免不一致状态,避免政出多头. 下面是单例模式的类图:包括的private和static修饰的实例instance.一个private的构造函数.一个static的getInstance函数 单例模式主要有三种:懒汉式单例.饿汉式单例.登记式单例三种 1.饿汉式单例:在类的初始化时候,自行创建了实例 c

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

(九)JAVA设计模式之单例模式

JAVA设计模式之单例模式 一.单例模式的介绍 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点.     全局对象和Singleton模式有本质的区别,因为大量使用全局对象会使得程序质量降低,而且有些编程语言根本不支持全局变量.最重要的是传统的全局对象并不能阻止一个类被实例化多次. 二.单例模式的特点 单例类只能有一个实例 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例.

socket 网摘

一.基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打 开文件的函数:socket(),调用socket(),该函数返回一个整型的socket的描述符,随后的连接建立.数据传输等操作也都是通过该socket实现. 1.socket函数 syntax:    int socket(int domain, int type, int protocol); 功能

JAVA设计模式有感

记得在大学学JAVA那阵,就觉得JAVA是一个c语言的一个包装,各种封装好的类库.功能,学习JAVA能快速上手编码.时隔8年,我感觉自己不懂JAVA. 最近看了有1个月的设计模式了,进度比较缓慢,一共才看了4个"策略模式","观察者模式","装饰者模式","工厂模式".也谈一谈自己的感受.其实这些设计模式以前也看过,当时的水准也就是硬生生记下了每个设计模式是怎么运作的,从没有想过它遵循了什么原则,达到了什么目的.因此,看过一遍

学习Java设计模式的10条建议

设计模式在整个Java的学习路线图中扮演着承上启下的作用. 在整个软件生命周期中,唯一不变的就是变化.设计模式就是要在软件设计.编码中对现有问题的一种总结,并从中寻求应对变化的策略. 自己初次接触设计模式有以下几个感觉: 内容很抽象. 示例都能看得懂,但不知道实际中如何应用. 不理解为什么要把“好好的程序”设计成这么复杂? 转眼之间到了需要自己参与需求分析.设计,并且维护之前留下的遗产代码(Legacy Code)的时候了. 再次开始学习设计模式,有了新的收获: 站在变化的角度去看,设计模式虽然