[置顶] 简述23种java设计模式之策略模式(strategy)
2016-10-11 19:03
447 查看
通过学习java设计模式,了解到之一的策略模式,我们通过一个 简单的例子来分析一下策略模式及他的好处。
首先我们举一个鸭子的例子,我们先创建一个鸭子类Duck,并写两个它的功能。注意我们把这个类写成抽象类,因为我们后面要有不同的鸭子来继承它。这里我写了一个抽象方法,为了后面继承实现时的一些逻辑操作。
public abstract class Duck{
public void swim(){
System.out.println("我会游泳");
}
public void eatmeal(){
System.out.println("我会吃饭");
}
public abstract void face();
}
下面我们创建三个子类分别继承这个Duck类
我创建了三个子类分别是北京烤鸭,绿头鸭和木头鸭,并且实现了里面的抽象方法,并声明了自己属于什么品种的逻辑操作。
这个时候呢,有的时候呢为了满足客户的需求,我们可能要给这个鸭子加一些功能,比如:飞。好,这个时候我们创建一个接口类Fly类并携带一个方法:
public interface Fly {
void fly();
}
这个时候呢客户又有要求啦,说这个烤鸭飞的高,绿头鸭子飞的低,木头鸭子不会飞啊,这怎么办呢,通常我们是把调用这个接口时在方法里面改逻辑,但是这样会很费时间,而且到后期修改时工作量也非常大,所以不妨我们在前期时麻烦一点,这个时候我们创建一个行为组 behavior,咱们把这个所有的飞的功能都给他创建,然后在不同品种的鸭子在去实现不同的飞行功能,下面看一下代码:
这里我们写三种飞行情况:低飞,高飞,不会飞,分别实现这个飞行接口类
public class DiFei 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("我是北京烤鸭");
}
}
最后在MainActivity中调用就可以了
最后我们在看一下打印效果
好了,这样的话策略模式就完成了,是不是感觉特别清晰,而且还能达到客户的要求,重要的是我们可以根据不同客户的不同要求去简单的更改代码,这里要提一点,我们可以根据自己项目要求或是客户要求,我们也可以把所有的鸭子属性都写成行为组,这样的话后期更改会更方便,后面还会有更多的模式像什么模板模式后面会有写到,对我们以后写代码会有很大帮助,当然写的不好的地方希望大家见谅 ,希望是对大家有好处吧~~~
首先我们举一个鸭子的例子,我们先创建一个鸭子类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() { 4000 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 5133 I/OpenGLRenderer: Initialized EGL, version 1.4 I/Choreographer: Skipped 35 frames! The application may be doing too much work on its main thread.
好了,这样的话策略模式就完成了,是不是感觉特别清晰,而且还能达到客户的要求,重要的是我们可以根据不同客户的不同要求去简单的更改代码,这里要提一点,我们可以根据自己项目要求或是客户要求,我们也可以把所有的鸭子属性都写成行为组,这样的话后期更改会更方便,后面还会有更多的模式像什么模板模式后面会有写到,对我们以后写代码会有很大帮助,当然写的不好的地方希望大家见谅 ,希望是对大家有好处吧~~~
相关文章推荐
- 【行为型模式】策略模式(Strategy)之23种java设计模式
- Java开发中的23种设计模式详解----策略模式(strategy)
- Java23种设计模式案例:策略模式(strategy)
- Java开发中的23种设计模式详解----策略模式(strategy)
- java 23种常用设计模式之策略模式(Strategy)
- java23种设计模式--策略模式(strategy)
- Java开发中的23种设计模式之十三:策略模式(strategy)
- Java设计模式透析之 —— 策略(Strategy)
- Java设计模式透析之 —— 策略(Strategy)
- JAVA设计模式—策略模式(Strategy)
- java 设计模式学习笔记十五 strategy 策略设计模式
- java设计模式13——策略模式(Strategy)
- java 设计模式--策略模式(strategy)
- Java设计模式透析之 —— 策略(Strategy)
- Java设计模式透析之 —— 策略(Strategy)
- 设计模式(二十一)----- 策略模式(Strategy)----(JAVA版)
- Java设计模式十: 策略模式(Strategy)
- 23种设计模式 之 Strategy模式(策略模式)[C语言]
- Java设计模式-----Strategy策略模式
- java设计模式:策略模式(Strategy)