Java设计模式——策略模式

来源《您的设计模式》
摘要:刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计, 一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用 JAVA 程序怎么表现这个呢?

一、类图

在这里插入图片描述

二、代码实现

2.1、"锦囊妙计"接口

//策略接口,这是诸葛亮给赵云的三个锦囊妙计的接口
public interface IStrategy {
    //每个锦囊妙计都是一个可执行的算法
    public void operate();
}

2.2、实现妙计的方法

  • 方法一:开后门
public class BackDoor implements IStrategy {
    @Override
    public void operate() {
        System.out.println("开后门:找人帮忙,阻止孙权杀刘备");
    }
}
  • 方法二:开绿灯
public class GivenGreenLight implements IStrategy {
    @Override
    public void operate() {
        System.out.println("开绿灯:求吴国放行");
    }
}
  • 方法三:断后
public class BlockEnemy implements IStrategy {
    @Override
    public void operate() {
        System.out.println("断后:阻挡追兵");
    }
}

2.3、锦囊

public class Context {
    //构造函数,要使用哪个妙计
    private IStrategy strategy;
    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }
    //使用计谋
    public void operate(){
        this.strategy.operate();
    }
}

*中途:然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:

2.4、拆开锦囊

public class ZhaoYun {
    public static void main(String[] args) {
        Context context;

        System.out.println("***************刚到吴国,拆开第一个****************");
        context = new Context(new BackDoor());//取出妙计
        context.operate();//执行

        System.out.println("***************想家了,拆开第二个****************");
        context = new Context(new GivenGreenLight());
        context.operate();

        System.out.println("***************回不了,拆开第三个****************");
        context = new Context(new BlockEnemy());
        context.operate();
        /*
		 *问题来了:赵云实际不知道是那个策略呀,他只知道拆第一个锦囊,
		 *而不知道是BackDoor这个妙计,咋办? 似乎这个策略模式已经把计谋名称写出来了
		 *
		 * 错!BackDoor、GivenGreenLight、BlockEnemy只是一个代码,你写成first、second、
		third,没人会说你错!
		 * 
		 * 策略模式的好处就是:体现了高内聚低耦合的特性呀,缺点嘛,这个那个,我回去再查查
		 */
    }
}

三、运行结果

在这里插入图片描述

后续:就这三招,搞的周郎是“陪了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了,还有一个就是扩展性,也就是 OCP 原则,策略类可以继续增加下去,只要修改 Context.java 就可以了,这个不多说了,自己领会吧!

四、总结

策略模式的主要角色就是:

  • 抽象策略类,定义一个公共接口,也就是本文中的 "锦囊妙计"接口
  • 具体策略类,实现抽象策略定义的接口,提供具体的算法实现,也就是本文中的实现妙计的方法
  • 环境类,一个策略类的引用,最终给客户端调用,也就是本文中的 锦囊
  • 客户端,调用环境类,也就是本文中的拆开锦囊的人。

最后,该文章来源的书籍《您的设计模式》的所有有关设计模式的内容生动且容易理解,强烈推荐学习!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值