设计模式GOF23——策略模式

策略模式(strategy),是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。

模式的职责

一些情况中,可能对具体选用那个方式,要根据实际情况来确定。这个时候,可以采用策略模式。

模式的必要性

其实这种情况用简单的if,else就可以实现了,那么为什么还要有策略模式呢?因为如果只是简单的if,else的话,对于比较复杂的逻辑会难以管理和维护,如果要新增类型也需要频繁修改同一段代码,不符合开闭原则。

模式的实现

//策略的 抽象
public interface Strategy {
    double finalprice(double price);
}
//策略的具体实现
class NormalClient implements Strategy{

    public double finalprice(double price) {
        //普通用户的算法
        return price;
    }

}
//策略的具体实现
class VipClient implements Strategy{

    public double finalprice(double price) {
        //普通Vip用户的算法
        return price*0.95;
    }

}
//策略的具体实现
class SuperVipClient implements Strategy{

    public double finalprice(double price) {
        //超级Vip用户的算法
        return price*0.85;
    }

}
//负责具体的策略类交互
//这样的话,具体的算法和直接调用的客户端就可以实现分离,使得算法可以独立于客户端独立的变化
public class Context {
    //需要调用的策略的对象,需要注入
    private Strategy strategy;
    //方法一:构造函数注入
    public Context(Strategy strategy){
        super();
        this.strategy = strategy;
    }
    //方法二:set函数注入
    public void setStrategy(Strategy strategy){
        this.strategy = strategy;
    }
    //其实也可以使用配置未见的注入方式,这里就不做例子了

    //调用策略对象的方法
    public void price(double price){
        //只要有对象.方法就可以了
        System.out.println(""+strategy.finalprice(price));
    }
}
//客户端调用
public class Client {

    public static void main(String[] args) {
        //创建策略的对象
        Strategy s = new NormalClient();
        //创建策略调用的对象(这里用的注入方式是构造方法注入,代码中的其他注入方法也可以实现)
        Context c = new Context(s);
        c.price(998);
    }

}

策略模式的注入有构造方法注入,set方法注入(其实也可以写其他方法注入),也能用配置文件注入,如果有框架支持,也可以像spring那样有注释注入。不同的注入对于不同的调用方法。

模式的本质

分离算法,选择实现

模式的实现的场景

JAVASE中GUI编程中,布局管理
Spring框架黄总,Resource接口,资源访问策略
Java,servlet.http.HttpServlet#service()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值