简述23种java设计模式之策略模式(strategy)

来源:互联网 发布:微信公众号80端口 编辑:程序博客网 时间:2024/03/29 20:59

通过学习java设计模式,了解到之一的策略模式,我们通过一个 简单的例子来分析一下策略模式及他的好处。

首先我们举一个鸭子的例子,我们先创建一个鸭子类Duck,并写两个它的功能。注意我们把这个类写成抽象类,因为我们后面要有不同的鸭子来继承它。这里我写了一个抽象方法,为了后面继承实现时的一些逻辑操作。

public abstract class Duck{        public void swim(){        System.out.println("我会游泳");    }    public void eatmeal(){        System.out.println("我会吃饭");    }    public  abstract  void  face();}
下面我们创建三个子类分别继承这个Duck类
public class BeiJingDuck extends Duck {        @Override    public void face() {        System.out.println("我是北京烤鸭");    }}
public class LvTouDuck extends Duck {    @Override    public void face() {        System.out.println("我是绿头鸭子");    }}
public class MuTouDuck extends Duck {       @Override    public void face() {        System.out.println("我是木头鸭子");    }}

我创建了三个子类分别是北京烤鸭,绿头鸭和木头鸭,并且实现了里面的抽象方法,并声明了自己属于什么品种的逻辑操作。

这个时候呢,有的时候呢为了满足客户的需求,我们可能要给这个鸭子加一些功能,比如:飞。好,这个时候我们创建一个接口类Fly类并携带一个方法:

public interface  Fly {    void fly();}
这个时候呢客户又有要求啦,说这个烤鸭飞的高,绿头鸭子飞的低,木头鸭子不会飞啊,这怎么办呢,通常我们是把调用这个接口时在方法里面改逻辑,但是这样会很费时间,而且到后期修改时工作量也非常大,所以不妨我们在前期时麻烦一点,这个时候我们创建一个行为组 behavior,咱们把这个所有的飞的功能都给他创建,然后在不同品种的鸭子在去实现不同的飞行功能,下面看一下代码:

这里我们写三种飞行情况:低飞,高飞,不会飞,分别实现这个飞行接口类

public class DiFei implements Fly {    @Override    public void fly() {        System.out.println("我会低飞");    }}
public class GaoFei implements Fly {    @Override    public void fly() {        System.out.println("我会高飞");    }}

public class ZhongFei implements Fly {    @Override    public void fly() {        System.out.println("我不会飞");    }}
这个时候还不可以实现我们的功能,我们还需在鸭子类中声明这个接口类的对象啊,还需要暴漏一个方法去实现这个接口类的方法

public abstract class Duck{    public Fly fly;    public void swim(){        System.out.println("我会游泳");    }    public void eatmeal(){        System.out.println("我会吃饭");    }    public  abstract  void  face();    public void Flys(){        fly.fly();    }}
这个
时候我们就可以在子类中去声明不同的接口对象

public class BeiJingDuck extends Duck {    public BeiJingDuck(){        fly=new GaoFei();    }    @Override    public void face() {        System.out.println("我是北京烤鸭");    }}
public class LvTouDuck extends Duck {    public LvTouDuck() {        fly=new DiFei();    }    @Override    public void face() {        System.out.println("我是绿头鸭子");    }}

public class MuTouDuck extends Duck {    public MuTouDuck() {        fly=new ZhongFei();    }    @Override    public void face() {        System.out.println("我是木头鸭子");    }}

最后在MainActivity中调用就可以了

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Duck duck=new BeiJingDuck();        duck.swim();        duck.eatmeal();        duck.face();        duck.Flys();        Duck duck1=new LvTouDuck();        duck1.swim();        duck1.eatmeal();        duck1.face();        duck1.Flys();        Duck duck2=new MuTouDuck();        duck2.swim();        duck2.eatmeal();        duck2.face();        duck2.Flys();    }}

最后我们在看一下打印效果
I/System.out: 我会游泳I/System.out: 我会吃饭I/System.out: 我是北京烤鸭I/System.out: 我会高飞I/System.out: 我会游泳I/System.out: 我会吃饭I/System.out: 我是绿头鸭子I/System.out: 我会低飞I/System.out: 我会游泳I/System.out: 我会吃饭I/System.out: 我是木头鸭子I/System.out: 我不会飞D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true                  [ 10-11 11:24:25.869  5133: 5133 D/         ]                  HostConnection::get() New Host Connection established 0xaac83fe0, tid 5133I/OpenGLRenderer: Initialized EGL, version 1.4I/Choreographer: Skipped 35 frames!  The application may be doing too much work on its main thread.

好了,这样的话策略模式就完成了,是不是感觉特别清晰,而且还能达到客户的要求,重要的是我们可以根据不同客户的不同要求去简单的更改代码,这里要提一点,我们可以根据自己项目要求或是客户要求,我们也可以把所有的鸭子属性都写成行为组,这样的话后期更改会更方便,后面还会有更多的模式像什么模板模式后面会有写到,对我们以后写代码会有很大帮助,当然写的不好的地方希望大家见谅 ,希望是对大家有好处吧~~~



1 0
原创粉丝点击