设计模式之策略模式01

设计模式之策略模式01

背景

举例说明策略模式

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,还真是解决了大问题,摘到最后赔了夫人又折兵,那我们先看下场景有是什么样子的。

分析

先说下场景中的要素:三个锦囊,一个赵云,妙计是小亮同志给的,妙计是安放在锦囊中的,俗称锦囊妙计,赵云是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用Java画出类图如下
策略模式类图

实现

三个妙计是同一类型的东东。写个接口

public interface IStrategy {

    //每个锦囊都是一个可执行的算法
    public void operate();

}

然后再写三个妙计

public class BackDoor implements IStrategy{

    public void operate() {

        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
    }

}
public class GiveGreenLight implements IStrategy{

    public void operate() {

        System.out.println("求吴国太开个绿灯,放行");
    }

}
public class BlockEnemy implements IStrategy{

    public void operate() {

        System.out.println("孙夫人断后,挡住追兵");
    }

}

三个妙计有了,需要地方来放置这些妙计,锦囊如下

public class Context {

    private IStrategy strategy;

    //构造要使用的妙计
    public Context (IStrategy strategy) {
        this.strategy = strategy;
    }

    //使用妙计,获得胜利
    public void operate() {
        this.strategy.operate();
    }

}

然后就是赵云拿着三个锦囊给刘老爷子办事。

public class Zhaoyun {

    /**
     * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计 
     * @param args
     */
    public static void main(String[] args) {
        Context context;
        System.out.println("-----------刚刚到吴国的时候拆第一个-------------");   
        context = new Context(new BackDoor()); 
        //拿到妙计   
        context.operate();  
        //拆开执行  
        System.out.println("\n\n");   

        System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");   
        context = new Context(new GiveGreenLight()); 
        //拿到妙计   
        context.operate();  
        //拆开执行  
        System.out.println("\n\n");   

        System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");   
        context = new Context(new BlockEnemy()); 
        //拿到妙计   
        context.operate();  
        //拆开执行  
        System.out.println("\n\n");   

    }

}

就这三招搞得周郎赔了夫人又折兵,这就是策略模式。高内聚低耦合的特点就表现出来了,还有一个就是扩展性,也就是OCP原则,策略类可以一直加下去,只要修改Context.java就好了。

github代码:

https://github.com/chenlisong/design

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值