设计模式-策略模式

从新开始更新自己的技术成长,记录成长点滴,好记性不如烂笔头,备忘。

根据设计模式即《head first》书中指导,该类设计模式共23种,这些模式又可归类分为构造型模式、结构型模式、行为型模式。今天就从先记录行为型中的策略模式开始。
为什么要先写策略模式呢,因为策略模式简单,可以引出相应的面向对象设计的一些相关的注意点。

策略模式在书中的定义是将算法族分别封装起来,让他们之间可以互相替换,作用是让算法的变化独立与使用算法的客户。

举个例子:现在基本上手机的普遍率为100%了,如洛基亚、Iphone、小米,现在让你使用代码模拟各类手机的的例子,
如手机缺省铃声、手机拍照功能、手机本省型号。如何实现呢?

原始做法如下:

public class IPhone{
say(){...};//缺省铃声
takephoto(){。。。}//拍照
display{};//获取本身手机信息

}

public class xiaomi{
say(){...}
takephoto(){。。。}
display{};

}

上面的例子代码的重复性太多,而且如果需要给手机随意添加一项功能/属性,则需要大量的维护原有的代码,不易于后期维护。为了使得代码可维护,也许我们可以使用我们所了解的面向对象原则,抽象出手机共有属性及方法,如下所示:
public class MPhone{
say();
takephoto(){};
display{//。。。};
}
抽象出共有方法,如say、takephoto交由手机的基类进行实现,各类手机只需要继承基类,将自动获得基类的方法。如下:
public class IPhone extend Mphone{
}
如上所示,所有继承Mphone手机的子类都将拥有父类的say();takephoto();display()方法。但是现实情况我们发现,各类手机的缺省铃声都是不一样的,那该怎么办?
当然我们也可以进行一下处理;
public abstract class IPhone{
say();
takephoto();
display(){
//获取手机本身型号。
};
}

将方法抽象,把具体实现交由各个具体子类中实现,这样做,每种手机可以在自己的类中写各自的实现。如
public class xiaomiPhone extend Mphone{
say(){"小米手机铃声"};
takephoto(){"小米手机拍照功能"}

}
那么,现在要大家将小米手机和苹果手机的铃声进行切换,这样,我们就发现麻烦了。按照上面的代码继续编写的话,我们将陷入不断的修改中...
如此,也就引出了策略模式:将算法族分别封装起来,让他们之间可以互相替换,作用是让算法的变化独立与使用算法的客户。其实这也是在我们进行面向对象设计的很重要的一点,
面向接口编程。

完整代码实例如下:

//手机基类
public abstract class phone{

PhoneBehaviour phoneBehaviour;
public void setPhoneBehaviour(PhoneBehaviour phoneBehaviour){
this.phoneBehaviour=phoneBehaviour;
}

public void say(){
phoneBehaviour.Say();
}

public void takephoto(){
phoneBehaviour.takephoto();
}
public abstract String display();

//获取手机本省属性
}


//行为接口
public interface PhoneBehaviour{
say();
takephoto();
}

//小米手机具体行为类
public class xiaomiPhoneImpl implements PhoneBehaviour{
say("我是小米手机");
takephoto(){"小米手机拍照功能"}
}

//苹果手机具体行为类
public class IPhoneImpl implements PhoneBehaviour{
say("我是苹果手机");
takephoto(){"苹果拍照功能"}
}

接下来,我们分别创建小米手机和苹果手机

//构建小米手机
public class xiaomiPhone extend phone{

public String display(){

//

}
}
//构建苹果手机

public class IPhone extend phone{

public String display(){

//
}

现在我们就可以让苹果手机发出小米手机的铃声,并且让苹果手机还是使用苹果手机的拍照功能;

public static void main(String[] args) {
Iphone iphone=new Iphone();
iphone.setPhoneBehaviour(new xiaomiPhoneImpl() );
iphone.say();
iphone.setPhoneBehaviour(new IPhoneImpl() );
iphone.takephoto();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值