博主博客地址:https://www.jeffcc.top/ 设计模式系列是我通过看Head First 的《设计模式》中学到的知识总结,这是本不错的设计模式入门书籍,强烈推荐!
权威定义:策略模式定义了算法簇,使不同的行为分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的对象! 我的理解:将相同的行为共同封装进入超类,不同的行为单独封装,以实现功能!
package main;
import main.fly.IFlyBehavior;
import main.quack.IQuackBehavior;
/**
* 模拟策略模式
* 行为对象代替继承
*/
public abstract class Duck {
// 定义一个飞行的行为
private IFlyBehavior flyBehavior;
// 定义一个叫声的行为
private IQuackBehavior quackBehavior;
public Duck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior) {
// 构造函数声明
this.flyBehavior = flyBehavior;
this.quackBehavior = quackBehavior;
}
// 鸭子的行为
public abstract void displace();
// 组合一层鸭子的飞行行为,不使用继承
public void performFly(){
flyBehavior.fly();
}
// 组合一层鸭子的叫声行为,不使用继承
public void performQuack(){
quackBehavior.quack();
}
// 手动设置飞行行为
public void setFlyBehavior(IFlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
// 手动设置叫声行为
public void setQuackBehavior(IQuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
package main;
import main.fly.Impl.FlyNoWayImpl;
import main.quack.Impl.MuteQuackImpl;
/**
* 模型鸭
* 继承鸭子行为
*/
public class ModelDuck extends Duck {
// 给模型鸭设定一个 不能飞 不会叫的行为
public ModelDuck(){
super(new FlyNoWayImpl(),new MuteQuackImpl());
}
@Override
public void displace() {
System.out.println("I am a model duck!");
}
}
package main.quack;
/**
* 叫声行为接口
*/
public interface IQuackBehavior {
void quack();
}
飞行行为接口
package main.fly;
/**
* 飞行行为接口
*/
public interface IFlyBehavior {
void fly();
}
package main.fly.Impl;
import main.fly.IFlyBehavior;
/**
* 不能飞的实现类
*/
public class FlyNoWayImpl implements IFlyBehavior {
@Override
public void fly() {
System.out.println("I can not fly!");
}
}
package main.fly.Impl;
import main.fly.IFlyBehavior;
/**
* 可以飞的实现类
*/
public class FlyWithWingsImpl implements IFlyBehavior {
@Override
public void fly() {
System.out.println("I can fly!");
}
}
package main.quack;
/**
* 叫声行为接口
*/
public interface IQuackBehavior {
void quack();
}
package main.quack.Impl;
import main.quack.IQuackBehavior;
/**
* 不能叫的实现类
*/
public class MuteQuackImpl implements IQuackBehavior {
@Override
public void quack() {
System.out.println("Silence");
}
}
package main.quack.Impl;
import main.quack.IQuackBehavior;
/**
* 哇哇叫的实现类
*/
public class QuackImpl implements IQuackBehavior {
@Override
public void quack() {
System.out.println("Qucak");
}
}
package main.quack.Impl;
import main.quack.IQuackBehavior;
/**
* 呱呱叫
*/
public class SqueckImpl implements IQuackBehavior {
@Override
public void quack() {
System.out.println("Squeak");
}
}
package test;
import main.Duck;
import main.ModelDuck;
import main.fly.Impl.FlyWithWingsImpl;
import main.quack.Impl.QuackImpl;
/**
* 测试类
*/
public class DuckTest{
public static void main(String[] args) {
// 创建一个模型鸭的实例
Duck duck = new ModelDuck();
duck.setFlyBehavior(new FlyWithWingsImpl());
duck.setQuackBehavior(new QuackImpl());
duck.performFly();
duck.performQuack();
duck.displace();
}
}