java设计模式-策略模式

来源:互联网 发布:vb winhttp 编辑:程序博客网 时间:2024/06/05 20:01

解决问题:根据不同的参数输入,选择不同的执行代码
疑问:通过if else 也可以达到该目的,代码还简单
个人理解:if else逻辑在代码里不好管理,输入参数会直接影响到代码块的逻辑,耦合度高


下面以大家都熟悉的锦囊妙计为例说明该模式的用法
1.有很多妙计,比如三个(妙计相当于输入不同的参数,执行的不同的代码块)
2.多个妙计要装在一个盒子里(锦囊)
3.使用妙计的人只需要打开盒子,拿出妙计,照着做就OK


代码如下

/** * 这是所有妙计的借口,提供执行方法,用盒子调用 * @author ietown * */public interface I {    public void operation();}

/** * 这是具体妙计,它实现了妙计接口 * @author ietown * */public class C1 implements I{    @Override    public void operation() {        System.out.println("第 1 策略实施");    }}

/** * 这是具体妙计,它实现了妙计接口 * @author ietown * */public class C2 implements I{    @Override    public void operation() {        System.out.println("第2策略实施");    }}

/** * 这是盒子,通过盒子执行妙计 * @author ietown * */public class Box {    private I i;        public Box(I i) {        this.i = i;    }        public void opreating() {        i.operation();    }}
/** * 这是具体使用者,他不管妙计的实现是什么,只需要传入他要执行的妙计,就可以得到妙计的执行结果 * 这里就是与if else控制不同的地方,如果是if else,那么当妙计的逻辑需要修改是,会直接修改使用者里的代码 * 另外,如果把 * Box box1 = new Box(new C1());        box1.opreating();            替换成    C1 c1 = new C1();    c1.operation();    似乎也是合理的,如果妙计逻辑需要修改,那么只要修改C1里的代码就可以了    但是,C1 c1 = new C1();是写在使用者代码里的,如果需要执行C2妙计,那么就需要把    C1 c1 = new C1(); 改成C2 c2 = new C2();这样还是需要修改使用者代码,造成耦合        所以,使用策略模式可以解决这种耦合,使用者代码里只需要定义Box,而至于使用那种策略    只是通过参数来控制就可以了     * @author ietown * */public class Main {    public static void main(String[] args) {        Box box = new Box(new C1()); // new C2(), new C3(), ..., new Cn()        box.opreating();            }}



0 0
原创粉丝点击