设计模式之我见(四)

来源:互联网 发布:淘宝发错货的处理规定 编辑:程序博客网 时间:2024/05/21 06:58

Twelve:责任链模式

责任链模式:有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。
链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象
缺点,大量的对象和引用

给大家举个例子吧。

智取威虎山大家都看了吧,座山雕和他的八个兄弟(算上杨子荣),某一天山寨兄弟们想要开宴会,但是要请示啊,所以他们就去找座山雕,座山雕不在,出去了,一时半会回不来,他们就去找了二当家。二当家也没在,他们只好去找老三。你看这就是一条链,老大不在,责任就落到老二身上了,老二不在责任就往后挪落在了老三的头上。

贴代码:

package com.zcl.design.responsibility;public abstract class AbstractHandler {private AbstractHandler abstractHandler;public void setHandler(AbstractHandler abstractHandler) {this.abstractHandler = abstractHandler;}public AbstractHandler getHandler() {return abstractHandler;}public abstract void operator();}
package com.zcl.design.responsibility;public class MyHandler extends AbstractHandler {private String name;public MyHandler(String name) {this.name = name;}public void operator() {System.out.println(name + "deal!");if (getHandler() != null) {getHandler().operator();}}}

package com.zcl.design.responsibility;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();      }  }  
Thirteen:状态模式

状态模式(State)当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线、隐身、忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1、可以通过改变状态来获得不同的行为。2、你的好友能同时看到你的变化。
根据这个特性,状态模式在日常开发中用的挺多的,尤其是做网站的时候,我们有时希望根据对象的某一属性,区别开他们的一些功能,比如说简单的权限控制等。

贴代码:

package com.zcl.design.state;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();          }      }  }

package com.zcl.design.state;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!");      }  }  

package com.zcl.design.state;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();      }  }
Fourteen:备忘录模式

备忘录模式(Memento)一个是专门用来存储状态,一个是专门用来存储备忘录。。。。。

等到状态改变并且想要回到原来的状态的时候就可以使用存储了的数据,来进行恢复。

贴代码:

package com.zcl.design.store;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;      }  }  

package com.zcl.design.store;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();      }  }  

package com.zcl.design.store;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;      }  }  
package com.zcl.design.store;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("修改后的状态为:" + origi.getValue());            // 回复原始类的状态          origi.restoreMemento(storage.getMemento());          System.out.println("恢复后的状态为:" + origi.getValue());      }  }  
Fifteen:访问者模式
访问者模式,顾名思义一个要访问别人,一个要被访问。但是你不能随便的就进行访问。你必须给你要访问的类发消息,你说我要去访问你了,然后人家说,你来吧可以访问我。然后你你就可以去访问那个类,也就是访问类内部的数据。

我还上传了Visitor模式的PPT和源码(对Visitor进行层层推进,每个知识点和拓展点都覆盖了),有兴趣的朋友可以下载来看


源码:

package com.zcl.design.vistor;public class MySubject implements Subject {@Override//访问者获取到自身属性public void accept(Visitor visitor) {System.out.println("MySubject类的accept函数被调用");visitor.visit(this);}@Overridepublic String getSubject() {System.out.println("MySubject类的getSubject函数被调用");return "welcome to mysubject";}}
package com.zcl.design.vistor;public interface Subject {//accept方法,接受将要访问它的对象,getSubject()获取将要被访问的属性public void accept(Visitor visitor);public String getSubject();}
package com.zcl.design.vistor;/** * @author zcl * */public interface Visitor {//一个Visitor类,存放要访问的对象public void visit(Subject sub);}
package com.zcl.design.vistor;public class MyVisitor implements Visitor {@Override//获取被访问者的属性public void visit(Subject sub) {System.out.println("MyVisitor类的visit函数被调用");System.out.println("visit the subject:"+sub.getSubject());}}
package com.zcl.design.vistor;public class MyVisitorTwo implements Visitor {@Override//获取被访问者的属性public void visit(Subject sub) {System.out.println("MyVisitorTwo类的visit函数被调用");System.out.println("visit the subject:"+sub.getSubject());}}
测试类:

package com.zcl.design.vistor;public class Test {public static void main(String[] args) {Visitor visitor = new MyVisitor();Visitor visitor2=new MyVisitorTwo();Subject sub = new MySubject();sub.accept(visitor);sub.accept(visitor2);}}

剩下的设计模式码出来了,但是没有在这个项目中,由于种种原因没有办法暂时没有办法再往里面写,还望见谅。之前所有的设计模式我都画出了类图不过在纸上,在我实验室没有带过来,以后补上。

这个是我自己辛苦码出来的,所以会设置积分。
如果急着想要的同学可以联系我,我会发给你。(邮箱 1359205840@qq.com)


1 0