设计模式(二)-策略(Strategy)模式

本文介绍了设计模式中的开闭原则,强调了软件实体应对扩展开放而对修改关闭的重要性,并通过策略模式的具体实例展示了如何在实际开发中应用这一原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先来看看设计模式的开闭原则

开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统。
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
开闭原则的含义:一个软件实体应该通过扩展来实现变化,而不是通过修改已有代码来实现变化。
注意:开闭原则对扩展开放,对修改关闭,并不意味着不做任何修改,低层模块的变更,必然要有高层模块进行耦合,否则就是一个孤立无意义的代码片段了。
变化的类型:逻辑变化、 子模块变化、可见试图变化一个项目的基本路径应该是这样的:项目开发、重构、测试、投产、运维,其中的重构可以对原有的设计和代码进行修改,运维尽量减少对原有代码修改,保持历史代码的纯洁性,提高系统的稳定性。

上面讲了很多理论,其实就是为下面的策略设计模式做一些铺垫,能扩展就不去修改。下面开始看个例子

这里写图片描述

下面看看设计图一目了然
这里写图片描述

遵循开闭原则的情况下扩展了弼马温职位。

下面我们再看策略设计模式的另一个例子
这里写图片描述

下面我们看看代码实现,就很简单。
场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、赵云(调用者)。

抽象策略类(Strategy)

 public interface Strategy {  
         public void operate();  
    } 

三个实现类(ConcreteStrategy):

妙计一:初到吴国

BackDoor.java

 public class BackDoor implements IStrategy {  
         @Override  
         public void operate() {  
              System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");  
         }  
    } 

妙计二:求吴国太开绿灯放行
GivenGreenLight.java

 public class GivenGreenLight implements IStrategy {  
         @Override  
         public void operate() {  
              System.out.println("求吴国太开个绿灯,放行");  
         }  
    } 

妙计三:孙夫人断后,挡住追兵

BlackEnemy.java

 public class BlackEnemy implements IStrategy {  
         @Override  
         public void operate() {  
              System.out.println("孙夫人断后,挡住追兵");  
         }  
    } 

环境类(Context)

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

下面是主方法

 public class Zhaoyun {  

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

         System.out.println("----------刚到吴国使用第一个锦囊---------------");  
         context = new Context(new BackDoor());  
         context.operate();  
         System.out.println("\n");  

         System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");  
         context.setStrategy(new GivenGreenLight());  
         context.operate();  
         System.out.println("\n");  

         System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");  
         context.setStrategy(new BlackEnemy());  
         context.operate();  
         System.out.println("\n");  
         }  
    } 

三招下来,搞得的周郎是“赔了夫人又折兵”。

不同的时候选择使用不同的策略。
下面我们再看一个例子
这里写图片描述

这里写图片描述
下面是代码的实现。

Strategy.java

/**
 * 策略,定义计算报价算法的接口
 */
public interface Strategy {
    /**
     * 计算应报的价格
     * @param goodsPrice 商品销售原价
     * @return 计算出来的,应该给客户报的价格
     */
    public double calcPrice(double goodsPrice);
}

CooperateCustomerStrategy.java

/**
 * 具体算法实现,为战略合作客户客户计算应报的价格
 */
public class CooperateCustomerStrategy implements Strategy{
    public double calcPrice(double goodsPrice) {
        System.out.println("对于战略合作客户,统一8折");
        return goodsPrice*0.8;
    }
}

LargeCustomerStrategy.java

/**
 * 具体算法实现,为大客户计算应报的价格
 */
public class LargeCustomerStrategy implements Strategy{
    public double calcPrice(double goodsPrice) {
        System.out.println("对于大客户,统一折扣10%");
        return goodsPrice*(1-0.1);
    }
}

NormalCustomerStrategy.java

/**
 * 具体算法实现,为新客户或者是普通客户计算应报的价格
 */
public class NormalCustomerStrategy implements Strategy{
    public double calcPrice(double goodsPrice) {
    System.out.println("对于新客户或者是普通客户,没有折扣");
        return goodsPrice;
    }
}

OldCustomerStrategy.java

/**
 * 具体算法实现,为老客户计算应报的价格
 */
public class OldCustomerStrategy implements Strategy{
    public double calcPrice(double goodsPrice) {
        System.out.println("对于老客户,统一折扣5%");
        return goodsPrice*(1-0.05);
    }
}

Price.java(相当于Context)

/**
 * 价格管理,主要完成计算向客户所报价格的功能
 */
public class Price {
    /**
     * 持有一个具体的策略对象
     */
    private Strategy strategy = null;
    /**
     * 构造方法,传入一个具体的策略对象
     * @param aStrategy 具体的策略对象
     */
    public Price(Strategy aStrategy){
        this.strategy = aStrategy;  }   
    /**
     * 报价,计算对客户的报价
     * @param goodsPrice 商品销售原价
     * @return 计算出来的,应该给客户报的价格
     */
    public double quote(double goodsPrice){
        return this.strategy.calcPrice(goodsPrice);
    }}

Client.java

public class Client {
    public static void main(String[] args) {
        //1:选择并创建需要使用的策略对象
        Strategy strategy = new OldCustomerStrategy();
        //2:创建上下文
        Price ctx = new Price(strategy);
        //3:计算报价
        double quote = ctx.quote(1000);
        System.out.println("向客户报价:"+quote);
    }
}

解释在图中

这里写图片描述

下面看看每个类的解释
这里写图片描述

图中都解释的很清楚,不懂得留言大家讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值