码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式1-策略模式

时间:2019-04-17 16:42:27      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:不同的   extend   接口   enc   model   将不   nts   head   package   

package DesignPattern;

public class StrategePattern {
    //来自HeadFirst设计模式
    interface FlyBehavior{
        //将飞行行为抽象为接口
        void fly();
    }
    interface QuackBehavior{
        //将鸭子叫抽象为接口
        void quack();
    }
    //下面将不同的飞行和鸭子叫封装为行为
    //飞行行为
    static class FlyWithWings implements FlyBehavior{
        @Override
        public void fly(){
            System.out.println("i fly with wings");
        }
    }
    static class FlyNoWay implements FlyBehavior{
        @Override
        public void fly() {
            System.out.println("i can not fly!");
        }
    }
    //鸭子叫行为
    //呱呱叫
    static class Quack implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("quack!");
        }
    }
    //吱吱叫
    static class Squeak implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("squeak!");
        }
    }
    //不会叫
    static class MuteQuack implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("<silence>");
        }
    }

    //整合行为
    public static class Duck{
        FlyBehavior flyBehavior;
        QuackBehavior quackBehavior;
        public void setFlyBehavior(FlyBehavior flyBehavior){
            this.flyBehavior=flyBehavior;
        }
        public void setQuackBehavior(QuackBehavior quackBehavior){
            this.quackBehavior=quackBehavior;
        }
        public void performQuack(){
            quackBehavior.quack();
        }
        public void performFly(){
            flyBehavior.fly();
        }
    }

    //某个Duck子类
    public static class MallardDuck extends Duck{
        MallardDuck(){
            this.flyBehavior=new FlyWithWings();
            this.quackBehavior= new Quack();
        }
    }

    public static void main(String[] args) {
        Duck model = new MallardDuck();
        model.performFly();
        model.performQuack();
        //通过set方法可以动态改变鸭子行为
        model.setQuackBehavior(new Squeak());
        model.performQuack();
    }
    /*
    通过封装行为,将鸭子和(飞行,叫)两个行为解耦,带来的好处
    1.实现行为接口就可以添加新行为,符合要扩展不要更改的设计原则
    2.可以自由组合(飞,叫)行为,提高了行为代码的可重用性

     */
}

设计模式1-策略模式

标签:不同的   extend   接口   enc   model   将不   nts   head   package   

原文地址:https://www.cnblogs.com/zhouyu0-0/p/10724319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!