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

通过学习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 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.

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值