java设计手机mobile类_java设计模式之策略模式

什么是策略模式?策略模式就是:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户,简单点来说就是“封装变化”.仍然以手机为列,举一个反列:有两个手机 HuaWeiMobile.java,和XiaoMiMobile.java,这两个手机都有一个1200W的后置摄像头来拍照( photo()方法),都能打电话( call() 方法),为了代码复用,不在每一个子类中都实现这两个方法,可以在这两个子类的父类(OppositeMobile.java)中实现这两个方法,就像下面这样

package strategy;

/**

* 反列

* @author Administrator

*

*/

public class OppositeMobile {

public void photo(){

System.out.println("用1200W后置摄像头拍照");

}

public void call(){

System.out.println("打电话");

}

}

但是这有一个问题,假如有一个魅族手机(MeiZuMoible.java)他的后置摄像头是2100W的,那怎么办?,有办法,我们可以重写 MeiZuMobile.java中的 photo()方法,从而覆盖父类的实现,一个还好说,假如有100个手机呢,都有自己的后置摄像头像素,每一次都要被迫去检查photo()方法,看是否需要覆盖父类的实现。这显然太糟糕了。。这时候就是策略模式大显身手的时候了。还记得刚说的策略模式的核心是什么了吗 “封装变化”,我们把 photo()这个方法抽取出来,定义到一个接口里边(Photo.java),如下

package strategy;

public interface Photo {

public void photo();

}这是不是一个策略?仔细想试是不是有那么点意思?,策略模式也有几个角色,如下:

(1)抽象策略角色(如上,Photo.java,一个接口)

(2)具体策略角色(下面的,PhotoWith1200.java,PhotoWith2100.java)

(2)环境角色(Mobile.java,持有对策略角色的引用)

我们定义一个Photo.java的实现类 PhotoWith1200.java给华为,和小米手机用来拍照用的,魅族不是浪吗,给魅族定义一个Photo.java的实现类 PhotoWith2100.java,给魅族用来拍照的。(这里面体现了一个设计原则:针对接口编程,这里的接口不是就单单指 interface,指的是针对超类型,父类啊,接口啊,都是超类型).

我们定义一个超类型 Mobile.java 让子类型 HuaWeiMobile.java , XiaoMiMobile.java ,MeiZuMobile.java 都继承此类。

环境角色 Mobile.java

package strategy;

public abstract class Mobile {

Photo photo;//环境角色,持有对策略角色的应用,这里要定义成超类型,不能定义成子类型。

public void photo(){

photo.photo();//委托,Mobile.java这货比较懒,本来该自己干的事,委托给了 Photo.java来干。

}

public void call(){

System.out.println("打电话");

}

//加入get,set 方法

public Photo getPhoto() {

return photo;

}

public void setPhoto(Photo photo) {

this.photo = photo;

}

}

上面体现了一个设计原则 :“多用组合,少用继承”,Mobile.java中的成员变量 photo 就是组合,然后委托photo干活,组合使Mobile.java具备了他自身没有的功能(photo的功能)

子类: HuaWeiMobile.java(也可以不继承,这里继承是为了复用 call() 方法 ,不继承的话Mobile.java就不能定义成抽象类了,应该定义成具体类,客户端ClientTest.java,中代码也要修改,比如 Mobile mobile=new Mobile(); mobile.set()......)

package strategy;

public class HuaWeiMobile extends Mobile {

public void identy(){

System.out.println("我是华为手机");

}

}

子类 :XiaoMiMobile.java (也可以不继承,这里继承是为了复用 call() 方法 )

package strategy;

public class XiaoMiMobile extends Mobile {

public void identy(){

System.out.println("我是小米手机");

}

}

子类:MeiZuMobile.java (也可以不继承,这里继承是为了复用 call() 方法 )

package strategy;

public class MeiZuMobile extends Mobile {

public void identy(){

System.out.println("我是魅族手机");

}

}

策略子类:PhotoWith1200.java

package strategy;

public class PhotoWith1200 implements Photo {

@Override

public void photo() {

System.out.println("用1200W后置摄像头拍照");

}

}

策略子类:PhotoWith2100.java

package strategy;

public class PhotoWith2100 implements Photo {

@Override

public void photo() {

System.out.println("用2100W后置摄像头拍照");

}

}

客户端测试类ClientTest.java

package strategy;

import static org.junit.Assert.*;

import org.junit.Test;

public class ClientTest {

@Test

public void test() {

//华为手机

HuaWeiMobile huaWeiMobile=new HuaWeiMobile();

//动态的设定华为手机的拍照方式 1200W

huaWeiMobile.setPhoto(new PhotoWith1200());

huaWeiMobile.identy();

huaWeiMobile.call();

huaWeiMobile.photo();

System.out.println("--------------->");

//小米手机

XiaoMiMobile xiaoMiMobile=new XiaoMiMobile();

//动态设定小米手机拍照方式 1200W

xiaoMiMobile.setPhoto(new PhotoWith1200());

xiaoMiMobile.identy();

xiaoMiMobile.call();

xiaoMiMobile.photo();

System.out.println("---------->");

//魅族手机

MeiZuMobile meiZuMobile=new MeiZuMobile();

//动态设定魅族手机拍照方式 2100W

meiZuMobile.setPhoto(new PhotoWith2100());

meiZuMobile.identy();

meiZuMobile.call();

meiZuMobile.photo();

}

}

我是华为手机

打电话

用1200W后置摄像头拍照

--------------->

我是小米手机

打电话

用1200W后置摄像头拍照

---------->

我是魅族手机

打电话

用2100W后置摄像头拍照 当然,如果你愿意的话,也可以让HuaWeiMobile.java 华为手机用上2100W的后置摄像头。。。o(╯□╰)o

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值