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

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

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


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不让发表)。这样,枪是抽象的同时,子弹也是抽象的。二者组合起来变换无穷。

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




你可能感兴趣的:(设计模式,算法,swing,brew)