java设计模式-策略模式

解决问题:根据不同的参数输入,选择不同的执行代码
疑问:通过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();
        
    }
}



你可能感兴趣的:(java设计模式-策略模式)