码迷,mamicode.com
首页 > 编程语言 > 详细

Java设计模式

时间:2017-10-27 23:55:40      阅读:418      评论:0      收藏:0      [点我收藏+]

标签:程序   没有   nat   nal   new   etc   mpi   bool   fit   

一、工厂模式(Factory)
二、建造模式(Builder)
三、原始模型模式(Prototype)
四、单例模式(Singleton)
五、适配器(Adapter)
六、桥梁模式(Bridge)
七、合成模式(Composite)
八、装饰模式(Decorator)
九、门面模式(Facade)
十、享元模式(Flyweight)
十一、代理模式(Proxy)
十二、职责链(Chain of Responsibility)
十三、命令模式(Command)
十四、解释器模式(Interpreter)
十五、迭代子模式(Iterator)
十六、调停者模式(Mediator)
十七、备忘录模式(Memento)
十八、观察者模式(Obserber)
十九、状态模式(State)
二十、策略模式(Strategy)
二十一、模板方法模式(Template Method)
二十二、访问者模式(Visitor)

 

一、工厂模式(Factory)

实例1:追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 。

public class Factory{   
      public static Sample creator(int which){
      //getClass 产生Sample 一般可使用动态类装载装入类。   
          if (which==1)     
                return new SampleA();   
         else if (which==2)     
                return new SampleB();
  }
}

实例2:请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

public abstract class Factory{   
       public abstract Sample creator();
}
public class AFactory extends Factory{
  public Sample creator(){     
            .........
            return new SampleA ();  
    }
}
public class BFactory extends Factory{
  public Sample creator(){     
            .........
            return new SampleB ();  
    }
}

二、建造模式(Builder)

实例:MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。

public interface Builder {   
       //創建部件A  比如創建汽車車輪   
        void buildPartA();   

        //創建部件B 比如創建汽車方向盤   
        void buildPartB();
  
        //創建部件C 比如創建汽車發動機   
        void buildPartC();  
 
        //返回最後組裝成品結果 (返回最後裝配好的汽車)   
        //成品的組裝過程不在這裏進行,而是轉移到下面的Director類別中進行。     
         //從而實現瞭解耦過程和部件   
        Product getResult();
}

public class Director {   
       private Builder builder;

   public Director( Builder builder ) {     
            this.builder = builder;   
       }
    
        // 將部件partA partB partC最後組成複雜物件   
        //這裏是將車輪 方向盤和發動機組裝成汽車的過程   
        public void construct() {     
            builder.buildPartA();
            builder.buildPartB();     
            builder.buildPartC();   
       }
}

三、原始模型模式(Prototype)

实例:跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。

public abstract class AbstractSpoon implements Cloneable {   
        String spoonName;   
        public void setSpoonName(String spoonName) {
            this.spoonName = spoonName;
        }   
        public String getSpoonName() {
            return this.spoonName;
        }   
        public Object clone() {     
            Object object = null;     
            try {       
                    object = super.clone();     
            } catch (CloneNotSupportedException exception) {
                    System.err.println("AbstractSpoon is not Cloneable");
            }     
             return object;   
        }
}
public class SoupSpoon extends AbstractSpoon {   
        public SoupSpoon(){     
            setSpoonName("Soup Spoon");   
        }
}  
public class SaladSpoon extends AbstractSpoon {   
        public SoupSpoon(){     
            setSpoonName("Salad Spoon");   
        }
}

四、单例模式(Singleton)

1、一个类只有一个实例
2、提供一个全局访问点
3、禁止拷贝
 
public class Singleton {
        private static Singleton instance = null;   

        public static synchronized Singleton getInstance() {   
             if (instance==null)     
                    instance=new Singleton();   
             return instance;   
        }
}
 

五、适配器(Adapter)

实例:在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了。

public interface IRoundPeg{   
    public void insertIntoHole(String msg);
}
public interface ISquarePeg{   
    public void insert(String str);
}
public class PegAdapter implements IRoundPeg,ISquarePeg{   
        private RoundPeg roundPeg;   
        private SquarePeg squarePeg;   

        // 構造方法1   
        public PegAdapter(RoundPeg peg){
            this.roundPeg=peg;
        }   
        // 構造方法 2  
        public PegAdapter(SquarePeg peg)(
            this.squarePeg=peg;
        }
        public void insert(String str){
            roundPeg.insertIntoHole(str);
        }
        public void insertIntoHole(String str){
            SquarePeg.insert(str);
        }
}

六、桥梁模式(Bridge)

实例:早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了 。

public abstract class Coffee {   
    CoffeeImp coffeeImp;   
    public void setCoffeeImp() {     
        this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();   
    }   
    public SodaImp getCoffeeImp() {
        return this.CoffeeImp;
    }   
    public abstract void pourCoffee();
}

public abstract class CoffeeImp {   
    public abstract void pourCoffeeImp();
}

 //bridge
public class CoffeeImpSingleton {   
    private static CoffeeImp coffeeImp;   
    public CoffeeImpSingleton(CoffeeImp coffeeImpIn){
        this.coffeeImp = coffeeImpIn;
    }   
    public static CoffeeImp getTheCoffeeImp() {     
        return coffeeImp;   
    }
}

七、合成模式(Composite)

 实例:Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。”“……”,MM都会用Composite模式了,你会了没有?

public abstract class Equipment {   
    private String name;    
    public abstract double netPrice();   
    public abstract double discountPrice();   
    //增加部件方法     
    public boolean add(Equipment equipment) {
        return false;
    }   
    //刪除部件方法   
    public boolean remove(Equipment equipment) {
         return false;
    }   

    //注意這裏,這裏就提供一種用於訪問組合體類別的部件方法。   
    public Iterator iter() {
        return null;
    }      
    public Equipment(final String name) {
         this.name=name;
    }
}

public class Disk extends Equipment
abstract class CompositeEquipment extends Equipment

八、装饰模式(Decorator)

 实例:Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

public interface Work {   
    public void insert();
}
public class SquarePeg implements Work{   
    public void insert(){     
        System.out.println("方形樁插入");   
    }
}
public class Decorator implements Work{   
    private Work work;   //額外增加的功能被打包在這個List中   
    private ArrayList others = new ArrayList();
  //在構造器中使用組合new方式,引入Work物件;   
    public Decorator(Work work) {     
        this.work=work;        
        others.add("挖坑");
    others.add("釘木板");   
    }
  public void insert(){
    newMethod();   
    }
  //在新方法中,我們在insert之前增加其他方法,這裏次序先後是用戶靈活指定的      
    public void newMethod(){     
        otherMethod();     
        work.insert();   
    }
    public void otherMethod(){     
        ListIterator listIterator = others.listIterator();     
        while (listIterator.hasNext()){       
            System.out.println(((String)(listIterator.next())) + " 正在進行");     
        }   
    }  
}

九、门面模式(Facade)

 实例:我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

public class DBCompare {  
    String sql = "SELECT * FROM <table> WHERE <column name> = ?";     
    try {      
        Mysql msql=new mysql(sql);     
        prep.setString( 1, "<column value>" );     
        rset = prep.executeQuery();     
        if( rset.next() ) {         
            System.out.println( rset.getString( "<column name" ));  
        }   
    } catch( SException e ) {     
         e.printStackTrace();   
    } finally {     
         mysql.close();     
        mysql=null;   
    }
}

十、享元模式(Flyweight)

 实例:每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。

public class CD {   
       private String title;
  private int year;
  private Artist artist;

  public String getTitle() {  return title; }
  public int getYear() {    return year;  }
  public Artist getArtist() {    return artist;  }

  public void setTitle(String t){    title = t;}
  public void setYear(int y){year = y;}
  public void setArtist(Artist a){artist = a;}

}
public class Artist {   
       //內部狀態
  private String name;
  // note that Artist is immutable.
  String getName(){return name;}  Artist(String n){
    name = n;
  }

}
public class ArtistFactory {   Hashtable pool = new Hashtable();

  Artist getArtist(String key){
    Artist result;
    result = (Artist)pool.get(key);
    ////産生新的Artist
    if(result == null) {
      result = new Artist(key);
      pool.put(key,result);
      
    }
    return result;
  }

}

十一、代理模式(Proxy)

实例:跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答。

public class ForumPermissions implements Cacheable;

public class ForumProxy implements Forum;

public class DbForum implements Forum, Cacheable

十二、职责链(Chain of Responsibility)

实例:晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

public interface Handler{
  public void handleRequest(Request request);
}

public class Request{
  private String type;

  public Request(String type){this.type=type;}
  public String getType(){return type;}
  public void execute(){
    //request真正具體行爲代碼
  }
}
public class ConcreteHandler implements Handler{
  private Handler successor;
  public ConcreteHandler(Handler successor){
    this.successor=successor;
  }
  public void handleRequest(Request request){
    if (request instanceof HelpRequest){
      //這裏是處理Help的具體代碼
    }else if (request instanceof PrintRequst){
      request.execute();
    }else
      //傳遞到下一個
      successor.handle(request);
    }
  }
}

十三、命令模式(Command)

实例:俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。”

public interface Command {
  public abstract void execute ( );
}
public class producer{
  public static List produceRequests() {
    List queue = new ArrayList();
    queue.add( new DomesticEngineer() );
    queue.add( new Politician() );
    queue.add( new Programmer() );
    return queue;
  }
}

public class TestCommand {
  public static void main(String[] args) {
    
    List queue = Producer.produceRequests();
    for (Iterator it = queue.iterator(); it.hasNext(); )
        //取出List中東東,其他特徵都不能確定,只能保證一個特徵是100%正確,
        // 他們至少是介面Command的"兒子"。所以強制轉換類別型爲介面Command

        ((Command)it.next()).execute();
     }
}

十四、解释器模式(Interpreter)

实例:俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。 

十五、迭代子模式(Iterator)

实例:

  我爱上了Mary,不顾一切的向她求婚。
  Mary:“想要我跟你结婚,得答应我的条件”
  我:“什么条件我都答应,你说吧”
  Mary:“我看上了那个一克拉的钻石”
  我:“我买,我买,还有吗?”
  Mary:“我看上了湖边的那栋别墅”
  我:“我买,我买,还有吗?”
  Mary:“我看上那辆法拉利跑车”
  我脑袋嗡的一声,坐在椅子上,一咬牙:“我买,我买,还有吗?”
//用來遍曆Collection中物件

public class TestCommand {
  public static void main(String[] args) {
    
    List queue = Producer.produceRequests();
    for (Iterator it = queue.iterator(); it.hasNext(); )
        //取出List中東東,其他特徵都不能確定,只能保證一個特徵是100%正確,
        // 他們至少是介面Command的"兒子"。所以強制轉換類別型爲介面Command

        ((Command)it.next()).execute();
     }
}

十六、调停者模式(Mediator)

实例:四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。
public interface Mediator { }
public class ConcreteMediator implements Mediator {    //假設當前有兩個成員.
   private ConcreteColleague1 colleague1 = new ConcreteColleague1();
   private ConcreteColleague2 colleague2 = new ConcreteColleague2();
   ... }
public class Colleague {
   private Mediator mediator;
   public Mediator getMediator() {
      return mediator;
   }

   public void setMediator( Mediator mediator ) {
      this.mediator = mediator;
   }
}
public class ConcreteColleague1 { }
public class ConcreteColleague2 { }

十七、备忘录模式(Memento)

实例:同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

public class Originator {

   private int number;
   private File file = null;
  public Originator(){}  // 創建一個Memento
  public Memento getMemento(){
    return new Memento(this);
  }  // 恢復到原始值
  public void setMemento(Memento m){
     number = m.number;
     file = m.file;
  }
}
private class Memento implements java.io.Serializable{   
       private int number;
  private File file = null;
  public Memento( Originator o){
    number = o.number;
    file = o.file;
  }
}

十八、观察者模式(Obserber)

 实例:想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦 。

public class product extends Observable{
  private String name;
  private float price;
  public String getName(){ return name;}
  public void setName(){
   this.name=name;
  //設置變化點
   setChanged();
   notifyObservers(name);
  }   
}
public class NameObserver implements Observer{   private String name=null;
  public void update(Observable obj,Object arg){

    if (arg instanceof String){
     name=(String)arg;
     //産品名稱改變值在name中
     System.out.println("NameObserver :name changet to "+name);
    }
  }
}

十九、状态模式(State)

实例:跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

public class BlueState extends State{
   public void handlepush(Context c){
     //根據push方法"如果是blue狀態的切換到green" ;
     c.setState(new GreenState());
  }
  public void handlepull(Context c){
     //根據pull方法"如果是blue狀態的切換到red" ;
    c.setState(new RedState());
  }
  public abstract void getcolor(){ return (Color.blue)}
}
public class Context{
  private Sate state=null; //我們將原來的 Color state 改成了新建的State state;
  //setState是用來改變state的狀態 使用setState實現狀態的切換
  pulic void setState(State state){

    this.state=state;
  }
  public void push(){
    //狀態的切換的細節部分,在本例中是顔色的變化,已經封裝在子類別的handlepush中實現,這裏無需關心
    state.handlepush(this);
    
    //因爲sample要使用state中的一個切換結果,使用getColor()
    Sample sample=new Sample(state.getColor());
    sample.operate();
  }
 
  public void pull(){
    state.handlepull(this);
    
    Sample2 sample2=new Sample2(state.getColor());
    sample2.operate();
  }
}

二十、策略模式(Strategy)

实例:跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

public abstract class RepTempRule{

protected String oldString="";
public void setOldString(String oldString){
  this.oldString=oldString;
}

protected String newString="";

public String getNewString(){
  return newString;
}
public abstract void replace() throws Exception;

}
public class test{ ......
  public void testReplace(){    //使用第一套方案進行替換。
    RepTempRule rule=new RepTempRuleOne();
    rule.setOldString(record);
    rule.replace();   }.....
}

二十一、模板方法模式(Template Method)

实例:追MM圣经规定了追MM在不同时期有不同的步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现);

public abstract class Benchmark
{
  /**
  * 下面操作是我們希望在子類別中完成
  */
  public abstract void benchmark();   /**
  * 重復執行benchmark次數
  */
  public final long repeat (int count) {
    if (count <= 0)
      return 0;
    else {
      long startTime = System.currentTimeMillis();    for (int i = 0; i < count; i++)
      benchmark();

    long stopTime = System.currentTimeMillis();
    return stopTime - startTime;
  }
}
}
public class MethodBenchmark extends Benchmark
{
  /**
  * 真正定義benchmark內容
  */
  public void benchmark() {

    for (int i = 0; i < Integer.MAX_VALUE; i++){
      System.out.printtln("i="+i);    
    }
  }
}

二十二、访问者模式(Visitor)

实例:情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了。

public interface Visitable
{
   public void accept(Visitor visitor);
}
public class ConcreteVisitor implements Visitor
{
   //在本方法中,我們實現了對Collection的元素的成功訪問
   public void visitCollection(Collection collection) {
      Iterator iterator = collection.iterator()
      while (iterator.hasNext()) {
         Object o = iterator.next();
         if (o instanceof Visitable)
            ((Visitable)o).accept(this);
      }    public void visitString(String string) {
      System.out.println("‘"+string+"‘");
   }
   public void visitFloat(Float float) {
      System.out.println(float.toString()+"f");
   }
}

Java设计模式

标签:程序   没有   nat   nal   new   etc   mpi   bool   fit   

原文地址:http://www.cnblogs.com/bingo1717/p/7745556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!