1、策略模式(Strategy)
对于一个任务来说,如果在执行过程中有多种算法可以实现而且可以在运行时根据情况更改不同的算法,则可以采用策略模式。策略模式主要思想是:定义一个算法的接口,每个算法用一个类来实现,客户端针对接口编写程序。
- 策略模式结构
- 以一个实例为例:商店购物付款可以使用现金、银行卡、支付宝、微信等支付方式,每一个行为都是支付,但其算法是不同的,对于支付方式实行策略模式。
首先创建算法接口和具体的算法类
public interface PaymentStrategy{
public void pay(int amount);
}
public class CreditCardStrategy implements PaymentStrtegy{//使用信用卡支付
private String name;
private String cardNumber;
private String dateofExpiry;
public CreditCardStrategy(String name,String number,String expiry){
this.name=name;
this.cardNumber=number;
this.dateofExpiry=expiry;
}
@Override
public void pay(int amount){
...
System.out.println(amount+" paid with credit card");
}
...
}
public class WeChatStrategy implements PaymentStrategy{//使用微信支付
private String ID;
private String password;
public WeChatStrategy(String id,String pword){
this.ID=id;
this.password=pword;
}
@Override
public void pay(int amount){
System.out.println(amount+" paid using WeChat.");
...
}
...
}
接下来创建一个Shop类记录所有人的支付
public class Shop{
...
public void pay(PaymentStrategy payment){
int amount=calculateTotal();
payment.pay(amount);
}
}
在Client端的使用
public class Client{
public static void main(String[] args){
Shop shop=new Shop();
...
shop.pay(new WechatStrategy("",""));//使用微信策略
shop.pay(new CreditCardStrategy("","",""));//使用信用卡策略
}
}
- 策略模式的缺点:所有策略类对外是暴露的,且有时方法比较多时策略类会比较多
2、模板模式(Template)
不同的客户端具有相同的算法步骤,但每个步骤具体实现不同时,可以使用模板模式,具体的思路是在父类中定义通用逻辑和各步骤的抽象方法,在子类中进行各步骤的具体实现,使用继承+重写实现算法的不同部分,用委托机制实现不同完整算法的调用(接口+多态)。
- 模板模式的结构
- 一个模板模式的实例。汽车的制造过程对于大多数品牌是类似的,可以使用同一个模板类。
首先创建模型类和具体实现类
public abstract class CarBuilder{
protected abstract void BuildSkeleton();//三个制造汽车的过程
protected abstract void InstallEngine();
protected abstract void InstallDoor();
public void BuildCar(){//通用逻辑
BuildSketlon();
InstallEngine();
InstallDoor();
}
}
public class PorcheBuilder extends CarBuilder{//车类1的制造
protected void BuildSkeleton(){
...
System.out.println("Building proche Skeleton");
}
protected void InstallEngine(){
...
System.out.println("Installing proche Engine");
}
protected void InstallDoor(){
...
System.out.println("Installing proche Door");
}
}
public class BeetleBuilder extends CarBuilder{//车类2的制造
protected void BuildSkeleton(){
...
System.out.println("Building Beetle Skeleton");
}
protected void InstallEngine(){
...
System.out.println("Installing Beetle Engine");
}
protected void InstallDoor(){
...
System.out.println("Installing Beetle Door");
}
}
Client端
public class Client{
public static void main(String[] args){
CarBuilder c=new PorchBuilder();
c.BuildCar();
c=new BeetleBuilder();
c.BuildCar();
}
}
- 模板模式的优点:行为由父类控制,具体实现在子类;封装不变部分,扩展可变部分。
- 模板模式的缺点:每一个实现都需要一个子类,会使类的数量增加。