您的位置:首页 > 编程语言 > Java开发

[置顶] 简述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类
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.


好了,这样的话策略模式就完成了,是不是感觉特别清晰,而且还能达到客户的要求,重要的是我们可以根据不同客户的不同要求去简单的更改代码,这里要提一点,我们可以根据自己项目要求或是客户要求,我们也可以把所有的鸭子属性都写成行为组,这样的话后期更改会更方便,后面还会有更多的模式像什么模板模式后面会有写到,对我们以后写代码会有很大帮助,当然写的不好的地方希望大家见谅 ,希望是对大家有好处吧~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: