设计模式------模板方法模式---桥梁模式

如果两个类的某个方法90%代码一样,怎么重用?

把不同的地方,抽出来变成一个方法,然后这两个类是继承关系,然后覆盖那个不同地方的方法就可以了~~~~
[code]


public abstract class CaffeineBeverage{
final void prepareRecipe(){
boilWater(); //固定的
brew(); //抽象的-----可以更加子类定制
pourInCup(); //固定的
addCondiments(); //抽象的
}

protected abstract void brew();
protected abstract void addCondiments();

void boilWater(){
//实现
}

void pourInCup(){
//实现
}
}

//但是有时候这些流程不是每个子类都有的,怎么办
//下面使用判断语句,使得流程可选
public abstract class CaffeineBeverage{

final void prepareRecipe(){
boilWater(); //固定的
brew(); //抽象的-----可以更加子类定制
if(getPourInCup()){
pourInCup(); //固定的
}
addCondiments(); //抽象的
}

abstract void brew(); //本来是可以用传参数的方法来处理变化的部分,但是java不支持传递函数这种类型作为参数,这样做就会有一个缺点,就是子类只能由一个这种实现,如果子类的这个部分也是变化的,怎么办。。?????方法是把这个东西变成接口,然后当作参数传递进来
abstract void addCondiments();

void boilWater(){
//实现
}

void pourInCup(){
//实现
}
public boolean getPourInCup(){
return true;
}
}


//Java中的模板方法-----Array.sort();----这个方法里面封装了怎么排序,可以对任意数字排序,但是怎么排的实现在子类中,所以子类要实现Comparable接口

public class Duck implements Comparable{
~~~~~
public int compareTo(Object obj){
Duck otherDuck = (Duck)obj;
if(this.weight - otherDuck.weight <0){
return -1;
}else if(this.weight - otherDuck.weight >0){
return 1;
}else {
return 0;
}
}
}

Duck[] ducks = {~~~~~};
Array.sort(ducks);

//Swing中JFrame中的paint()方法。。。在默认状态下,paint()是不做事情的,因为它是一个"钩子",通过覆盖paint(),你可以将自己的代码插入JFrame的算法中,显示你所要话的图。。。。没想到这是一个模板方法的应用

-----------------------------------------------------------------------------------------------
模板方法的缺点:---多层次继承的缺点
父类有一个方法A,Son继承了这个方法,然后GrandSon也继承了这个方法,问题是突然有一天Son要重写父类的这个方法,他敢吗?绝对不敢,GrandSon可是要从Father继承过来这个方法A,你修改了,那就要修改Son和GrandSon之间的关系,那么这个风险就大了

但是桥梁模式描述了类间弱关联关系,Father类完全可以把可能变化的方法放出去,Son子类要有这个方法很简单,桥梁搭过去,获得这个方法,GrandSon也一样,即使你Son子类不想使用这个方法了,也没有关系,不会对GrandSon产生影响。。。

继承的好处,对于比较明确不变化的,通过继承来完成,若不能确定是否会变化,那么就芮乃伟是会变化的,通过桥梁模式来解决

也就是说变化的子类里面也有变化,变化中的变化
因为有抽象类,说明具体类不同-----》调用者在变化
因为有接口,说明接口外的东西是不稳定的---》被调用者在变化
随着时代的发展,枪在不停的变化改进。与此同时枪的子弹也在改进,很多子弹赋予了新功能:比如信号弹,救援弹,甚至是炸蛋(这里故意写错,要不然javaeye不让发表)。这样,枪是抽象的同时,子弹也是抽象的。二者组合起来变换无穷。

与策略模式不同在于: 算法(过程)是不变的,变的是被调用者


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值