博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
秒懂策略模式--简单明了的例子
阅读量:4936 次
发布时间:2019-06-11

本文共 2462 字,大约阅读时间需要 8 分钟。

1.

策略模式将行为和环境隔离开来,环境角色类负责维持和查询行为的类,各种类似的逻辑算法都在各个具体的策略类中进行实现,由于环境和行为隔离开来,所以行为的逻辑变更不会影响到环境和客户端。

2.uml类图:

这个模式涉及到三个角色:

环境(Context)角色:持有一个Strategy的引用。

抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

 

3.代码结构截图:(代码不多,耐心看完)

4.代码如下:

abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。           需要注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。           凡是抽象类,就一定会是某个类的父类!否则,这个抽象类的存在没有意义,因为抽象类不能被实例化。           既然抽象类一定是某一个类的父类,所以,这个抽象类一定要有构造函数!这样,抽象类的子类才能成功实例化。           抽象类也有构造函数,只是,这个构造函数是给子类提供的。所以如果抽象类继承其他类,那么抽象类的构造函数也会使用super语句,所以被继承类也必须有对外提供的构造函数
public abstract class Strategy {    //定义抽象策略的方法    public abstract int strategy(int a, int b);//假如这是一种支付业务,支付策略有4种}
public class Context {    //持有抽象策略角色的引用,用于客户端调用    private Strategy strategy;//获得策略类    public Strategy getStrategy() {        return strategy;    }    //设置所需策略    public void setStrategy(Strategy strategy) {        this.strategy = strategy;    }    //根据设置的策略类返回对应的结果    public int getResult(int a, int b) {        return strategy.strategy(a, b);    }}
public class Client {    public static void main(String[] args) {        Context context = new Context();        int result;        context.setStrategy(new StrategySecond());        result = context.getResult(1, 2);        System.out.println("Second: "+result);        context.setStrategy(new StrategyOne());        result =context.getResult(4, 3);        System.out.println("One: "+result);        context.setStrategy(new StrategyThird());        result = context.getResult(5, 5);        System.out.println("Third: "+result);        context.setStrategy(new StrategyFourth());        result = context.getResult(6, 6);        System.out.println("Fourth: "+result);    }}
public class StrategyOne extends Strategy {    public int strategy(int a, int b) {        //无卡支付方式        return a + b*2;//此处写相关业务代码    }}public class StrategySecond extends Strategy {    //会员支付方式             public int strategy(int a, int b)    {                 return a+b;//此处写相关业务代码             }         }public class StrategyThird extends Strategy {//applePay支付    public int strategy(int a,int b)    {                 return a+b*3;//此处写相关业务代码             } }public class StrategyFourth extends Strategy {     public int strategy(int a,int b)     {
//某某支付方式 return a+b*4;//此处写相关业务代码 } }

 

转载于:https://www.cnblogs.com/xbjhs/p/9397190.html

你可能感兴趣的文章
用查表法快速转换yv12到RGB【转】
查看>>
使用公钥登录SSL
查看>>
实验四 shell 编程(2)
查看>>
hdu 1290_献给杭电五十周年校庆的礼物
查看>>
Nginx 入门
查看>>
openCR-用ROS代码点亮LED的方法
查看>>
豆瓣电影api
查看>>
BufferedInputStream和FileInputStream的区别
查看>>
二阶段之六
查看>>
微博爬虫 python
查看>>
中石油 【递归】普通递归关系
查看>>
vue报错Error in render: "TypeError: Cannot read property '0' of undefined"
查看>>
silverlight 隐藏ChildWindow 右上角的关闭按钮
查看>>
likely() 和 unlikely()
查看>>
03一些View总结
查看>>
MapReduce--平均分,最高,低分以及及格率的计算
查看>>
mac下管理论文的工具
查看>>
POJ3122Pie(二分)
查看>>
WF+WCF+WPF第二天--模拟超市收银
查看>>
爬取贴吧好看的桌面图片 -《狗嗨默示录》-
查看>>