设计模式-策略模式

介绍:
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

主要解决:
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

在这里插入图片描述

实现:

  1. 策略组件-01
/**
 * 基础策略接口
 *
 * @author liuyuan
 * @version PHStrategy.java, v 0.1 2020-04-13 9:15
 */
public interface PCStrategy {

    /**
     * 策略执行接口
     */
    void execute();
}


/**
 * @author liuyuan
 * @version Iphone.java, v 0.1 2020-04-13 9:18
 */
public class Mac implements PCStrategy {

    @Override
    public void execute() {
        System.out.println("Mac开始执行了~~~");
    }
}


/**
 * @author liuyuan
 * @version Android.java, v 0.1 2020-04-13 9:17
 */
public class Windows implements PCStrategy {

    @Override
    public void execute() {
        System.out.println("Windows策略开始执行了~~~");
    }
}
  1. 策略组件-02
/**
 * 基础策略接口
 *
 * @author liuyuan
 * @version PHStrategy.java, v 0.1 2020-04-13 9:15
 */
public interface PHStrategy {

    /**
     * 策略执行接口
     */
    void execute();
}


/**
 * @author liuyuan
 * @version Iphone.java, v 0.1 2020-04-13 9:18
 */
public class Iphone implements PHStrategy {

    @Override
    public void execute() {
        System.out.println("Iphone开始执行了~~~");
    }
}


/**
 * @author liuyuan
 * @version Android.java, v 0.1 2020-04-13 9:17
 */
public class Android implements PHStrategy {

    @Override
    public void execute() {
        System.out.println("Android 策略开始执行了~~~");
    }
}
  1. Context
import com.example.designmode.strategy.pcstrategy.PCStrategy;
import com.example.designmode.strategy.phonestrategy.PHStrategy;

/**
 * @author liuyuan
 * @version Context.java, v 0.1 2020-04-13 9:18
 */
public class Context {

    private PCStrategy pcStrategy;

    private PHStrategy phStrategy;

    /**
     * Setter method for property <tt>PHStrategy</tt>.
     *
     * @param pcStrategy value to be assigned to property PHStrategy
     */
    public void setPcStrategy(PCStrategy pcStrategy) {
        this.pcStrategy = pcStrategy;
    }

    /**
     * Setter method for property <tt>phStrategy</tt>.
     *
     * @param phStrategy value to be assigned to property phStrategy
     */
    public void setPhStrategy(PHStrategy phStrategy) {
        this.phStrategy = phStrategy;
    }

    public void pcExecute() {
        pcStrategy.execute();
    }

    public void phExecute() {
        phStrategy.execute();
    }
}
  1. 测试
import com.example.designmode.strategy.pcstrategy.Mac;
import com.example.designmode.strategy.pcstrategy.Windows;
import com.example.designmode.strategy.phonestrategy.Android;
import com.example.designmode.strategy.phonestrategy.Iphone;

/**
 * @author liuyuan
 * @version Test.java, v 0.1 2020-04-13 9:20
 */
public class Test {

    public static void main(String[] args) {

        Context context = new Context();

        // 注入策略组件
        context.setPcStrategy(new Mac());

        // 执行策略方法
        context.pcExecute();

        context.setPcStrategy(new Windows());

        context.pcExecute();

        context.setPhStrategy(new Iphone());

        context.phExecute();

        context.setPhStrategy(new Android());

        context.phExecute();
    }

}

在这里插入图片描述
补充:

spring项目中,可以考虑将Context类去掉,采用枚举维护 类型:类别名 的方式,通过spring的上下文直接获取对应的实现类,执行组件的策略方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值