问题:什么是设计模式(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)角色:包装了相关的算法或行为
通用接口
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();
}
}