简述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
- 简述23种java设计模式之策略模式(strategy)
- java设计模式之策略模式 Strategy
- Java设计模式之--策略模式(strategy)
- java设计模式之 strategy策略模式
- 23设计模式之策略模式(Strategy)
- 23设计模式之策略模式(Strategy)
- java设计模式之Strategy (策略)
- 【行为型模式】策略模式(Strategy)之23种java设计模式
- 23种设计模式之策略模式(Strategy)
- 23种设计模式之策略模式(Strategy Pattern)
- 23种设计模式之-----策略模式(Strategy Pattern)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- VxWorks开发板驱动程序学习之SPI
- js局部变量和全局变量的区别
- java网络编程之UDP
- 如何成功安装使用MySQL
- HTML5学习_day07(2)--BFC定义
- 简述23种java设计模式之策略模式(strategy)
- WebView详解
- Android ListView工作原理完全解析,带你从源码的角度彻底理解
- java.lang.UnsupportedOperationException 解决方案
- Python requests 小技巧总结
- sql注入 xss跨站脚本攻击 csrf跨站请求伪造
- mapreduce机制及mapreduce任务的分析
- 64位编译 ParaView QT4 64位 总结
- 51nod 1278 相离的圆(二分)