类才有设计模式?用方法不行么?
来源:互联网 发布:金猪报喜源码下载 编辑:程序博客网 时间:2024/05/01 12:49
类才有设计模式?用方法不行么?
我以为,一定程度限制新手很难应用设计模式到实际中的因素之一便是:设计模式是基于面向对象思想的,书中关于设计模式讲解均以类、接口为实现基础,可在实际使用中,新手对面向对象理解不够透彻,有限的开发经验很难想到需要那么多类的应用场景,由此造成无从下手的现状。
==============
真的必须要依赖于类吗?
不是的,虽然大部分设计模式都需要继承、接口等来实现。但是缩小应用场景,从方法级的角度,也可以实现部分设计模式的应用,毕竟设计模式只是一种思想! 我们学习设计模式,并不是要去套用,而是在将来需要时
而且从方法级的角度讲解,更容易被新手理解,并尽快付诸实践。
但也要说明的是,虽然方法级的设计模式实现很容易,但是也丢失了很多类的特性,比如多态,并且作用域也被限制了。
下面我就开始举例啦。
责任链模式
为什么要从责任链模式开始讲呢?因为它更具代表性,也是它启迪我的。
责任链模式概念:使多个对象都有机会处理请求,从而避免了请求的发送者和请求者的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有人处理为止。
我们替换为方法的概念:是多个处理方法都有机会处理请求,将这些方法连成一条链,并沿着这条链传递请求,直到有人处理为止。(毫无违和感是不是?)
那么开始实践吧。
现在我有一个需求。我有一个Banner,需要根据当前手机的状态显示不同的内容。优先级最高的是网络,就是没有网的时候一定要是没有网络。其次是Gps,然后是登录状态,最后才是用户通知内容。你看,一个明确的优先级顺序,就是一条链嘛。
看代码:
/** * 刷新Banner */public void refreshBanner() { this.banner.setText(bannerChainState());}/** * 检查banner状态并返回要显示内容 */private String bannerChainState(){ return bannerChainNet();}/** * 检查网络状态并返回要显示内容 */private String bannerChainNet(){ if(NetWork.isClose()) return "请打开网络"; else return bannerChainGps();}/** * 检查Gps状态并返回要显示内容 */private String bannerChainGps(){ if(Gps.isClose()) return "请开启GPs"; else return bannerChainLogin();}/** * 检查登录状态并返回要显示内容 */private String bannerChainLogin(){ if(Login.isLogin()) reutrn "请登录"; else return bannerChainData();}/** * 检查通知信息并返回要显示内容 */private String bannerChainData(){ return "你有一条新通知";}
这不就是一条责任链吗?
责任链模式的方法实现完成啦。
工厂模式/建造者模式
工厂模式的实现更为简单。但方法级的工厂模式作用域被打打缩小了。
方法级的工厂模式,适用于类内部多处大量创建的场景。
举例,如果有一个大量Dialog弹出交互的需求,Dialog一个弹完又一个,且Dialog大部分类似,那么你可以设立三个Dialog工厂方法:
//创建Dialog方法private Dialog createDialog(int type);//创建DialogView方法private View createDialogView(int type);//创建Dialog监听事件方法private DialogEvent createDialogEvent(int type);
在createDialog中调用createDialogView,createDialogEvent两个方法。
同理,方法级的工厂是将对象创建封装进一个方法,建造者模式同样可以将对象创建的过程封装进一个方法内。
模板模式
java的多态除了可以通过继承、接口来实现,重载同样是多态的一种,编译时多态。
模板模式的方法级实现,略微偏移原本,但也是你熟悉的,就是方法的重载。
看代码一目了然。
需求:创建一个小汽车
//创建默认汽车private Car createCar(){ return createCar(“宝马”,“红色”,“SUV”);}//自定义品牌private Car createCar(String brand){ return createCar(brand,"红色",“SUV”)}//自定义品牌和颜色private Car createCar(String brand,String color){ return createCar(brand,color,"SUV");}//所有属性自定义private Car createCar(String brand,String color,String type){ return new Car(brand,color,type);}
代理模式/装饰模式
代理模式、装饰模式都是委托的一种,在原有对象的基础上进行扩展。只不过代理模式更注重的是对过程的控制,而装饰模式更注重对功能的扩展。
而方法级别的委托,就是在原有方法的基础上对过程或功能进行限制于扩展。
需求:开车
//真正的开车方法//oil:油量 bat:速度 driverAge:司机年龄private void drive(int oil ,int bat,int driverAge)//扩展方法private void driveCar(int oil ,int bat,int driverAge){ //限制 if(checkOil(oil)){ Log.w("油不够"); return ; } //限制 if(checkBat(bat)){ Log.w("超速啦"); } //扩展 driverAge = checkDriverAge(driverAge); //汽车启动了真的启动~ drive(oil,bat,driverAge);}//检查油箱private boolean checkOil(int oil){ if(oil<=10){ Log.w("油不够呀"); return false; } else if(oil >= 200){ Log.w("油加的太多了太危险"); return false; } else { return true; }}private boolean checkBat(int bat){ if(bat >= 200){ Log.w("超速了,不能跑!"); return false; } return true;}private int checkDriverAge(int age){ if(age < 18){ //年龄太小了不能开呀,伪造一下吧 return 18; } return age;}
适配器模式
适配器模式的作用是将本来接口不同,不能依赖的对象转变为接口相同,可以依赖的对象。
方法级的适配器模式也是同样的道理.
本来我只能接受int型参数你却给了我String,本来我要的是User对象,你给了我一个userId.
class MyClass{ int age; User user; public void setAge(int age){ this.age = age; } public void setAge(String age){ this.age = Integer.valueOf(age); } public void setUser(User user){ this.user = user; } public void setUser(int userId){ this.user = UserManager.findUser(userId); }}
- 类才有设计模式?用方法不行么?
- 设计模式:工厂方法模式
- 设计模式:模板方法模式
- 设计模式 - 模板方法模式
- 设计模式:模板方法模式
- 设计模式 模板方法模式
- 设计模式 工厂方法模式
- 设计模式--模板方法模式
- 设计模式-【模板方法模式】
- 设计模式-【工厂方法模式】
- 设计模式: 模板方法模式
- 设计模式-工厂方法模式
- 设计模式- 模板方法模式
- 设计模式--模版方法模式
- 设计模式 - 模板方法模式
- 设计模式 - 工厂方法模式
- 设计模式 - 模板方法模式
- 设计模式-工厂方法模式
- Android签名机制介绍:生成keystore、签名、查看签名信息等方法
- mysql Error Code
- UIGestureRegnizer 的一些注意点
- ubuntu下安装opencv 读取摄像头
- 2016年3月22日 14:48:59
- 类才有设计模式?用方法不行么?
- Android-->UDP协议的Socket数据传输
- 存储过程基本概念和操作
- Jett+Spring MVC实现Excel导出
- 本人用过的三方库
- jQuery中$(document).ready(function(){})函数的作用
- Android NotificationManager 和Notification的使用总结
- spark shuffle
- Android学习文章推荐