设计模式-策略模式

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

应用场景:根据用户需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法)扩展。

备注:

  1.   观察者模式定义了对象之间的一对多关系。
  2.   主题(也就是观察者)用一个共同的接口来更新观察者。
  3.   观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
  4.   使用此模式时,你可从被观察者处推(push)或(pull)数据(然而,推的方式被认为更“正确”)。
  5.   有多个观察者时,不可以依赖特定的通知次序。
  6.   Java有多种观察者模式的实现,包括了通用的java.util.Observable。
  7.   要注意java.util.Observable实现上所带来的一些问题。
  8.   如果有必要的话,可以实现自己的Observable,这样不难,不要害怕。
  9.   Swing大量使用观察者模式,许多GUI框架也是如此。
  10.   此模式也被应用在许多地方,例如:JavaBeans、RMI。 

demo:


说明:

 duck 封装鸭子各种行为。

QuackBehavior 封装呱呱叫行为。

FlyBehavior 封装飞行行为。


public abstract class Duck {
    QuackBehavior quackBehavior;
    FlyBehavior flyBehavior;
    public Duck() {}
    public void performQuack(){
        quackBehavior.quack();
    }
    public void performFly(){
        flyBehavior.fly();
    }
    public void setFlyBehavior(FlyBehavior fb){
        flyBehavior = fb;
    }
    public void setQuackBehavior(QuackBehavior qb){
        quackBehavior = qb;
    }
public class ModelDuck extends Duck{

    public ModelDuck() {
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }

    public void display() {
        System.out.println("I'm a model deuck");
    }
public class MallardDuck  extends Duck{
    public MallardDuck(){
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }

    public void display() {
        System.out.println("..........I'm a real Mallard duck");
    }
}
public interface FlyBehavior {
    /**
     * 飞行方法
     */
    void fly();
}
 
public class FlyRocketPowered implements FlyBehavior{
    public void fly() {
        System.out.println("I'm flying with a rocket!");
    }
}
public class FlyWithWings implements FlyBehavior{

    public void fly() {
        System.out.println("...飞行,真的会飞的");
    }
}
public class FlyNoWay implements FlyBehavior{
    public void fly() {
        System.out.println("......不会飞行");
    }
}
public interface QuackBehavior {

    /**
     * 叫方法
     */
    void quack();
}
public class Quack implements QuackBehavior{
    public void quack() {
        System.out.println("......真的鸭子,呱呱叫");
    }
}
public class Squeak implements QuackBehavior{
    public void quack() {
        System.out.println("..........橡皮鸭子吱吱叫");
    }
}
public class MuteQuack implements QuackBehavior{
    public void quack() {
        System.out.println("..........什么都不做,不会叫");
    }
}


public class Test1 {
    public static void main(String[] args) {
        Duck mallard = new MallardDuck();
        mallard.performQuack();
        mallard.performFly();
    }
}

public class Test2 {
    public static void main(String[] args) {
        Duck mallard = new MallardDuck();
        mallard.performQuack();
        mallard.performFly();
        System.out.println("--------------------------");
        Duck model = new ModelDuck();
        model .performFly();
        //动态的改变它的飞行行为。
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值