设计模式入门——策略模式

OO原则:封装、继承、多态

封装:隐藏类的内部实现机制,在不影响使用者的前提下改变内部结构,同时保护了数据

继承:可以使得好东西多次被利用,同时为多态做准备

多态:方法重写、重载、动态连接构成多态性。

背景:

我们设计父类Duck并实现各种方法(如游泳swim(),呱呱叫quack(),外貌dispaly()),每个鸭子都会继承Duck来实现自己各自的方法(如不同鸭子不同的外貌)。由于业务的需求,我们需要实现让鸭子飞,如果在父类Duck中直接实现fly()方法,可能会出现一些问题,如继承Duck的模型鸭也会实现了飞行,除此之外模型鸭只会吱吱叫,显然与父类的呱呱叫不符。

方案一:利用继承,每个鸭子在自己的内部实现quack()和fly()方法,模型鸭在类方法quack()中用吱吱叫覆盖原有方法。

不可行:因为产品会变,一旦quack()和fly()方式变了,就要检查所有的子类,并可能去覆盖原有的方法,不符合代码复用原则

设计:

原则一:找出应用中可能需要变化的部分独立出来,不要和不变的混在一起。

实现一:将fly()和quack()方法,单独拎出来实现,分别建立一组新的类代表每个行为(如FlyWithWings、FlyNoWay)。

原则二:针对接口编程,而不是针对实现编程。

实现二:所有的飞行类都继承FlyBehavior接口,同理quack

优点:利用多态可以实现超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。

// d为Dog类型,必须对具体代码进行实现
Dog d = new Dog();
d.bark();


// 定义Animal类型的引用,指向Dog对象,可以实现多态调用(既可以实现子类独特的功能,也可以抽取父类的共性)。
Animal a = new Dog();
a.makeSound();

原则三:多用组合,少用继承

实现三:将两个类结合起来使用就是组合,如每个鸭子都有一个FlyBehavior和QuackBehavior,将飞行和呱呱叫委托给他们代为处理。

优点:有一个(HAS-A)比是一个(IS-A)可能更好,使用组合建立系统具有很大的弹性,不仅可将算法簇封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。

实现:

// 所有飞行行为都必须实现接口
public interface FlyBehavior{
    public void fly();
}

public class FlyWithWings implements FlyBehavior{
    public void fly(){
        System.out.println("I am flying");
    }
}

public class FltNoWay implements FlyBehavior{
    public void flt(){
        System.out.println("I can't fly");
    }
}
// 实现抽象的鸭子父类
public abstract class Duck{
    FlyBehavior flyBehavior;   //为行为接口声明两个引用变量,所有鸭子都会继承它们
    
    public abstract void display();

    public void performFly(){
        flyBehavir.fly();
    }

    public void swim(){
        System.out.println("All ducks float");
    }

}
// 实现Duck类
public class MallardDuck extends Duck{
    
    public MallardDuck (){
        flyBehavior = new FlyWithWings(); // 使用FlyWithWings作为FlyBehavior的类型
    }
    
    public void display(){
        System.out.println("I'm a real Mallard duck");
    }
    
}
// 主类
public class MiniDuckSimulator {
    public static void main(String[] args){
        Duck mallard = new MallardDuck();
        mallard.performFly();  // 调用继承类的performFly()方法
    }
}

总结:

策略模式定义了算法簇,分别封装起来,让它们之间可以故乡替换,此模式让算法的变化独立于使用算法的客户。

模式被认为是历经验证的OO设计经验,它不是代码,而是针对设计问题的通用解决方案。我们可以把他们应用到特定的应用中。它不是被发明,而是被发现。

大多数的模式和原则,都是着眼于软件变化的主题。我们常常把变化的部分和不变的部分分离开来。

模式让开发人员之间有共享的语言,能够最大化沟通的价值。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值