每天一个设计模式之策略模式

时间:2021-01-18 22:00:12

策略模式

策略模式是定义了算法族,分别封装起来,让他们之间可以互相转换,让算法的变化独立于使用算法的人

一个最简单的策略模式的原型

//环境角色类
public class Context {
private Strategy strategy;

public Context(Strategy strategy){
this.strategy = strategy;
}

public void contextInterface(){
strategy.strategyInterface();
}
}

//抽象策略类
public interface Strategy {
public void strategyInterface();
}

//具体策略类1
public class ConcreteStrategyA implements Strategy {
@Override
public void strategyInterface() {
//重写算法
}
}

//具体策略类2
public class ConcreteStrategyB implements Strategy {
@Override
public void strategyInterface() {
//重写算法
}
}

首先我们来说明一下这个策略模式的骨架是有哪些构成的,
环境(Context)角色 持有 策略对象的引用
抽象策略(Strategy)角色 抽象的对象,提供给环境对象持有,并且具体策略类会继承重写此类。
具体策略(ConcreteStrategy)角色 对算法的重写和包装

那么我们现在用一个简单例子来说明这个设计模式 叫做老王家的孩子如何吃饭 策略

//抽象策略类   吃饭策略
public interface EatStrategy {
public double eat(int count);
}

// 子算法策略
// 大儿子吃饭
public class BigStrategy implements EatStrategy {
@Override
public double eat(int count) {
System.out.println("大儿子吃饭");
return count;
}
}

// 二儿子吃饭
public class TwoStrategy implements EatStrategy {
@Override
public double eat(int count) {
System.out.println("二儿子吃饭");
return count;
}
}

// 妈妈让儿子们去吃饭
//环境角色
public class Mam{
//持有一个具体的策略对象
private Strategy strategy;

public Mam(Strategy strategy){
this.strategy = strategy;
}

public double MamLetEat(int count){
return this.strategy.eat(count);
}
}

//客户端
public class Client {
public static void main(String[] args) {
//创建策略对象
Strategy strategyBig = new BigStrategy();
Strategy strategyTwo = new TwoStrategy();
//创建环境
Mam mam1 = new Mam(strategyBig );
Mam mam2 = new Mam(strategyTwo );
// 开始吃饭
int count1 = mam1.MamLetEat(300);
int count2 = mam2.MamLetEat(500);
System.out.println("大儿子吃了 :" + count1 );
System.out.println(" 二儿吃了 :" + count2 );
}
}

策略模式的理解
策略模式的特点是将一个算法系列进行均衡,对一些具体的算法。大家有一些部分是公用的,有一些需要自己的部分,但是大家是平等的,这样大利用均衡性。算法之间可以相互替代。所有的策略模式的算法都是相互独立互不影响大