java设计模式-策略模式

模式导读:

      在生活中,我们时常会遇到好多类似的场景,在购物的时候,我们作为消费者可以选择各种购买东西的方式,比如我可以购买零食,购买生活用品,购买饮料,也就是根据适用场景选择对应的实施方式。然而当我们作为一名店长面对消费者时,我们可以根据各种不同的客户定制相应的优惠策略,也就是销售的策略也可以根据不同的客户而有不同的实施方式。

参考类图:

实现代码:

1.首先要有一个抽象的策略类接口,里面对应不同的应用场景可以定义不同的抽象方法

1 package com.etc;
2 //抽象策略类
3 public interface Strategy {
4     //购物时的场景
5     void shopping();
6 
7 }

2.然后定义具体的策略子类实现对应场景下的策略方法

(1).BuyDrinks.java

复制代码
 1 package com.etc;
 2 //具体策略实现子类
 3 public class BuyDrinks implements Strategy {
 4     //定义具体的策略实现方法
 5     @Override
 6     public void shopping() {
 7 
 8         System.out.println("选择购买饮料");
 9     }
10 
11 }
复制代码

(2)BuySnacks.java

复制代码
 1 package com.etc;
 2 //具体策略实现子类
 3 public class BuySnacks implements Strategy {
 4 //定义具体的策略实现方法
 5     @Override
 6     public void shopping() {
 7         
 8         System.out.println("选择购买零食");
 9 
10     }
11 
12 }
复制代码

3.定义一个类实现一个能够根据不同用户需要然后选择返回对应的不同具体策略实现的方法,就是你用户需要什么,我就给你一个分析师判断你的需求,然后选择对应的策略实施方式

复制代码
 1 public class Holder {
 2     // 以集合对象存储针对不同的情况下不同执行策略
 3     Map<String, Strategy> map = new HashMap<>();
 4 
 5     // 初始化所有可能情况以及选择相关策略
 6     private void init() {
 7         map.put("饿", new BuySnacks());
 8         map.put("渴", new BuyDrinks());
 9     }
10 
11     // 针对不同情景选用不同策略
12     public Strategy select(String msg) {
13         init();
14         Strategy s = map.get(msg);
15         return s;
16     }
17 }
复制代码

4.定义一个测试类打印不同的策略实施方式

复制代码
 1 //客户端
 2 public class Client {
 3 
 4     public static void main(String[] args) {
 5 
 6         String hungry = "饿";
 7         String dry = "渴";
 8         Holder holder = new Holder();
 9         // 根据不同的情景选择对应策略
10         holder.select(hungry).shopping();
11         holder.select(dry).shopping();
12     
13     }
14 }
复制代码

运行效果截图:

策略模式的优缺点:

优点:可以动态的改变对象的行为

缺点:1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
   2、策略模式将造成产生很多策略类
适用场景:

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

 

posted @   无影云  阅读(249)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· Ollama本地部署大模型总结
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络
· C 语言内存布局深度剖析:从栈到堆,你真的了解吗?
点击右上角即可分享
微信分享提示