java设计模式---策略模式(strategy pattern)

策略模式的核心思想是:多用组合/聚合  少用继承。用行为类组合,而不是行为类继承。

策略类的缺点就是:每添加一个策略就要增加一个类,当策略过多时,类的数量也是会相应增加。

举一个例子,我们统称一类鸭子,鸭子我们分为三类,北京鸭、野鸭、玩具鸭,假定野鸭的飞行能力最强,北京鸭飞行能力差,玩具鸭不会飞。还是鸭子嘎嘎叫、游泳等特性行为。

传统的继承的实现方式如下:

抽象鸭子类

public abstract class Duck {
    public Duck(){
    }

    public abstract void display();//现实鸭子的信息

    public void quack(){
        System.out.println("鸭子嘎嘎叫");
    }

    public void swim(){
        System.out.println("鸭子会游泳");
    }

    public void fly(){
        System.out.println("鸭子会飞");
    }
}

再具体一个个实现:

public class WildDuck extends Duck{

    public void display() {
        System.out.println("这是野鸭");
    }
}
public class PekingDuck extends Duck{

    public void display() {
        System.out.println("北京鸭子");
    }

    //北京鸭子不能飞,所以重写fly方法
    public void fly(){
        System.out.println("北京鸭子飞行差");
    }
}
public class ToyDuck extends Duck{

    public void display() {
        System.out.println("玩具鸭子");
    }

    //玩具鸭子不具备鸭子的功能,方法都需要重写
    public void quack(){
        System.out.println("玩具鸭子不会嘎嘎叫");
    }

    public void swim(){
        System.out.println("玩具鸭子不会游泳");
    }

    public void fly(){
        System.out.println("玩具鸭子不会飞");
    }
}

针对飞行这个行为,我们使用策略模式如下:

1、新建一个行为接口

public interface FlyBehavior {
    void fly();//子类自己去实现
}

2、行为各有实现

public class GoodFly implements FlyBehavior{
    public void fly() {
        System.out.println("飞行技术很好");
    }
}
public class BadFly implements FlyBehavior{
    public void fly() {
        System.out.println("飞行技术糟糕");
    }
}
public class NoFly implements FlyBehavior{
    public void fly() {
        System.out.println("不会飞");
    }
}

3、这时候再对具体的对象,采用组合的方式,添加行为

public class WildDuck extends Duck {

    FlyBehavior flyBehavior;
    //用构造器,传入 FlyBehavior 的对象
    public WildDuck(){
        flyBehavior = new GoodFly();
    }

    public void display() {
        System.out.println("这是野鸭");
    }
    
}
public class PekingDuck extends Duck {

    FlyBehavior flyBehavior;
    public PekingDuck(){
        flyBehavior = new BadFly();
    }

    public void display() {
        System.out.println("北京鸭子");
    }

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
}
public class ToyDuck extends Duck {

    public void display() {
        System.out.println("玩具鸭子");
    }

    FlyBehavior flyBehavior;

    public ToyDuck(){
        flyBehavior = new NoFly();
    }


    //玩具鸭子不具备鸭子的功能,方法都需要重写
    public void quack(){
        System.out.println("玩具鸭子不会嘎嘎叫");
    }

    public void swim(){
        System.out.println("玩具鸭子不会游泳");
    }

}

4、写一个客户端测试下:

public class TestClient {
    public static void main(String[] args) {
        WildDuck wildDuck = new WildDuck();
        wildDuck.flyBehavior.fly();

        ToyDuck toyDuck = new ToyDuck();
        toyDuck.flyBehavior.fly();

        //调整需求,要求北京鸭子飞行能力是很好的
        PekingDuck pekingDuck = new PekingDuck();
        pekingDuck.setFlyBehavior(new GoodFly());
        System.out.println("北京鸭子的实际飞行能力");
        pekingDuck.flyBehavior.fly();
        
    }
}

输出结果:

飞行技术很好
不会飞
北京鸭子的实际飞行能力
飞行技术很好

以上是对飞行这个行为进行了策略,我们还可以针对游泳这个行为进行策略。具体就不再写了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 原型模式(Prototype Pattern) - 建造者模式(Builder Pattern) 2. 结构型模式(Structural Patterns): - 适配器模式(Adapter Pattern) - 桥接模式(Bridge Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 策略模式Strategy Pattern) - 模板方法模式(Template Method Pattern) - 访问者模式(Visitor Pattern) 4. 并发型模式(Concurrency Patterns): - 保护性暂停模式(Guarded Suspension Pattern) - 生产者-消费者模式(Producer-Consumer Pattern) - 读写锁模式(Read-Write Lock Pattern) - 信号量模式(Semaphore Pattern) - 线程池模式(Thread Pool Pattern) 这些设计模式可以根据问题的特点和需求来选择使用,它们提供了一些可复用的解决方案,有助于开发高质量、可维护且易于扩展的软件系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值