策略模式
策略模式定义了短发族,分别封装起来,让它们之间可以相互替换,次模式让算法发变化独立于使用算法到的客户。
策略模式类图:
示例UML图:
示例实现
package com.kkb.dp.strategy;
/**
* 飞行的行为
* @date 2021年4月13日
* @describe
*/
public interface FlyBav {
public void fly();
}
package com.kkb.dp.strategy;
/**
* @date 2021年4月13日
* @describe 飞行行为实现2
*/
public class CanNotFly implements FlyBav{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("我不能飞。。");
}
}
package com.kkb.dp.strategy;
/**
* @date 2021年4月13日
* @describe 飞行行为实现1
*/
public class CanFly implements FlyBav{
@Override
public void fly() {
System.out.println("我能飞。。");
}
}
package com.kkb.dp.strategy;
/**
*
* @author wuxiaomei
* @describe 叫的行为
*/
public interface QuackBav {
public void quack();
}
package com.kkb.dp.strategy;
/**
* @date 2021年4月13日
* @describe 叫的行为实现2
*/
public class CanNotQuack implements QuackBav{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("我不能叫。。");
}
}
package com.kkb.dp.strategy;
/**
* @date 2021年4月13日
* @describe 叫的行为实现1
*/
public class CanQuack implements QuackBav{
@Override
public void quack() {
System.out.println("我能叫。。");
}
}
package com.kkb.dp.strategy.main;
import com.kkb.dp.strategy.FlyBav;
import com.kkb.dp.strategy.QuackBav;
/**
* 鸭子父类
* @date 2021年4月13日
* @describe
*/
public abstract class Duck {
//飞的行为
protected FlyBav fBav;
//叫的行为
protected QuackBav qBav;
/**
* 构造函数
* @param fBav
* @param qBav
*/
public Duck(FlyBav fBav, QuackBav qBav) {
this.fBav = fBav;
this.qBav = qBav;
}
//子类实现
public abstract void display();
/**
* 飞的方法
*/
public void flay() {
//委托给了飞的行为的飞方法
fBav.fly();
}
public void quack() {
//委托给了叫的行为的叫方法
qBav.quack();
}
/**
* 开始游戏
*/
public void paly() {
this.display();
this.flay();
this.quack();
}
}
package com.kkb.dp.strategy.main;
import com.kkb.dp.strategy.FlyBav;
import com.kkb.dp.strategy.QuackBav;
/**
* @date 2021年4月13日
* @describe 鸭子子类:绿鸭子
*/
public class GreenDuck extends Duck{
public GreenDuck(FlyBav fBav, QuackBav qBav) {
super(fBav, qBav);
}
@Override
public void display() {
System.out.println("我是一只绿鸭子");
}
}
package com.kkb.dp.strategy.main;
import com.kkb.dp.strategy.FlyBav;
import com.kkb.dp.strategy.QuackBav;
/**
* @date 2021年4月13日
* @describe 鸭子子类:橡皮鸭子
*/
public class RubberDuck extends Duck{
public RubberDuck(FlyBav fBav, QuackBav qBav) {
super(fBav, qBav);
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("我是一只橡皮鸭子");
}
}
package com.kkb.dp.strategy.main;
import com.kkb.dp.strategy.CanFly;
import com.kkb.dp.strategy.CanNotFly;
import com.kkb.dp.strategy.CanNotQuack;
import com.kkb.dp.strategy.CanQuack;
/**
* 测试类
* @date 2021年4月13日
* @describe
*/
public class DuckTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//能飞能叫
Duck d1 = new GreenDuck(new CanFly(), new CanQuack());
d1.paly();
//能叫不能飞
Duck d2 = new RubberDuck(new CanFly(), new CanNotQuack());
d2.paly();
}
}
测试类运行结果:
我是一只绿鸭子
我能飞。。
我能叫。。
我是一只橡皮鸭子
我能飞。。
我不能叫。。
需求:
新增不能飞不能叫的北京烤鸭
package com.kkb.dp.strategy.main;
import com.kkb.dp.strategy.FlyBav;
import com.kkb.dp.strategy.QuackBav;
/**
* @date 2021年4月13日
* @describe 鸭子子类:北京烤鸭
*/
public class BJDuck extends Duck{
public BJDuck(FlyBav fBav, QuackBav qBav) {
super(fBav, qBav);
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("我是北京烤鸭");
}
}
package com.kkb.dp.strategy.main;
import com.kkb.dp.strategy.CanFly;
import com.kkb.dp.strategy.CanNotFly;
import com.kkb.dp.strategy.CanNotQuack;
import com.kkb.dp.strategy.CanQuack;
/**
* 测试类
* @date 2021年4月13日
* @describe
*/
public class DuckTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//能飞能叫
Duck d1 = new GreenDuck(new CanFly(), new CanQuack());
d1.paly();
//能叫不能飞
Duck d2 = new RubberDuck(new CanFly(), new CanNotQuack());
d2.paly();
//不能飞不能叫
Duck d3 = new BJDuck(new CanNotFly(), new CanNotQuack());
d3.paly();
}
}
测试类运行结果:
我是一只绿鸭子
我能飞。。
我能叫。。
我是一只橡皮鸭子
我能飞。。
我不能叫。。
我是北京烤鸭
我不能飞。。
我不能叫。。