设计模式——策略模式(Strategy)

问题:什么是设计模式(Design Pattern)?

通俗的来讲设计模式是代码设计经验的总结;是程序员在实际开发中面对一些问题,比如松耦合,代码复用等问题,经过不同的尝试,反复比较而得到的解决方案。

那么怎么才能实现代码复用呢?

面向对象有几个原则:
单一职责原则 (Single Responsiblity Principle SRP)
开闭原则(Open Closed Principle,OCP)、
里氏代换原则(Liskov Substitution Principle,LSP)、
依赖倒转原则(Dependency Inversion Principle,DIP)、
接口隔离原则(Interface Segregation Principle,ISP)、
合成/聚合复用原则(Composite/Aggregate ReusePrinciple,CARP) 、
最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)。
开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。

初识代码设计模式之策略模式

策略模式的思想:
定义算法族,分别封装起来,让他们可以相互替换,让算法的变化独立于使用算法的客户。
策略模式的着重点:不是去考虑算法如何实现,而是专注于对算法的组织和调用。
运用的一些原则:
封装的变化,
面向接口编程。

策略模式涉及到三个角色:

● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为

  1. 具体案列代码

    1.1 需求
    大家都去品牌店里面买过衣服,品牌店里面一般有一个根据顾客的累计购买金额进行打折。对于不同的顾客来说价钱不一样。

  2. 具体代码

通用接口

package pattern.strategy;

/**
 * @Author: Han Yu
 * @Description:支付的接口,抽象的策略角色
 * @Date: Create in 11:39 2019/2/18
 */
public interface Pay {
    void makeMoney();
}

具体策略类1

package pattern.strategy;

/**
 * @Author: Han Yu
 * @Description:具体的策略角色
 * @Date: Create in 11:42 2019/2/18
 */
public class CommonPay  implements Pay{
    @Override
    public void makeMoney() {
        System.out.println("普通用户  不打折");
    }
}

具体策略类2

package pattern.strategy;

/**
 * @Author: Han Yu
 * @Description:具体的策略角色
 * @Date: Create in 11:42 2019/2/18
 */
public class VipPay implements Pay {
    @Override
    public void makeMoney() {
        System.out.println("vip用户  打八折");
    }
}

策略上下文

package pattern.strategy;

/**
 * @Author: Han Yu
 * @Description:环境角色,策略的上下文
 * @Date: Create in 11:46 2019/2/18
 */
public class PayContent {

//    实现接口的引用(抽象策略角色的引用)
    Pay pay;

//    用构造方法确定觉得的实现类  具体的策略角色通过构造注入
    public  PayContent(Pay pay){
        this.pay = pay;
    }

    public void makePay(){
        pay.makeMoney();
    }

}

测试

package pattern.strategy;

/**
 * @Author: Han Yu
 * @Description:测试类
 * @Date: Create in 11:59 2019/2/18
 */
public class PayTest {
    public static void main(String []args){
//        创建策略上下文 并注入不同的具体策略角色
        PayContent payContent = new PayContent(new CommonPay());
        payContent.makePay();
        PayContent payContent1 = new PayContent(new VipPay());
        payContent1.makePay();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值