设计模式15---桥接模式

当一个事物或者过程有很多变化时,比如开车走路,如何我们用继承的方法,类的数目会几何增长。

但是我们如何把每个变化隔离开来,也就是,车子和路况隔离开来,这样每个变化都是独立的。

public abstract class Automobile {

    public static final int TYPE_CAR = 1;

    public static final int TYPE_MOTORCYCLE = 2;    

    public abstract int Run();

}

对于路来说,它影响的是不同的比率。

package com.jayfulmath.designpattern.bridge;



public abstract class Road {

    public static final int TYPE_CITY = 1;

    public static final int TYPE_HIGHWAY = 2;

    public static final int TYPE_SUBURBAN = 3;

    

    protected String TAGNAME;

    protected Automobile _mAuto;    

    protected double _miles;

    

    public abstract double SpeedRate();//汽车速度比率

    

    

    public Road(double _miles) {

        this._miles = _miles;

    }



    /**

     * @param _mAuto the _mAuto to set

     */

    public void set_mAuto(Automobile _mAuto) {

        this._mAuto = _mAuto;

    }





    public double Run()

    {

        

//        System.out.println("distance of "+TAGNAME+" is "+_miles+" km");

        System.out.println(String.format("distance of %s is %.0f km", TAGNAME,_miles));

        double speed = _mAuto.Run()*SpeedRate();

        double h = _miles/speed;

        System.out.println(String.format("%s spend time %.2f hours", TAGNAME,h));

        return h;

    }

}

car:

package com.jayfulmath.designpattern.bridge;



public class Car extends Automobile {

    

    private static Car _mInstance = null;

    

    private Car() {

        super();

    }

    

    public static Car getInstance()

    {

        if(_mInstance == null)

        {

            _mInstance = new Car();

        }

        return _mInstance;

    }

    

    @Override

    public int Run() {

        // TODO Auto-generated method stub

        System.out.print("Car Run 50km/h at:");

        return 50;

    }



}

Motorcycle:

package com.jayfulmath.designpattern.bridge;



public class Motorcycle extends Automobile {



    

    private static Motorcycle _mInstance = null;

    

    private Motorcycle() {

        super();

    }

    

    public static Motorcycle getInstance()

    {

        if(_mInstance == null)

        {

            _mInstance = new Motorcycle();

        }

        return _mInstance;

    }

    

    @Override

    public int Run() {

        // TODO Auto-generated method stub

        System.out.print("Motorcycle Run 30km/h at:");

        return 30;

    }



}

 

HighWay:

package com.jayfulmath.designpattern.bridge;



public class HighWay extends Road {



    public HighWay(double _miles) {

        super(_miles);

        this.TAGNAME = "HighWay";

    }



    @Override

    public double SpeedRate() {

        // TODO Auto-generated method stub

        System.out.println("In "+TAGNAME);

        return 1.5;

    }

}
package com.jayfulmath.designpattern.bridge;



public class Suburban extends Road {



    public Suburban(double _miles) {

        super(_miles);

        this.TAGNAME = "Suburban";

    }



    @Override

    public double SpeedRate() {

        // TODO Auto-generated method stub

        System.out.println("In "+TAGNAME);

        return 1.0;

    }

}
package com.jayfulmath.designpattern.bridge;



public class CityRoad extends Road {



    public CityRoad(double _miles) {

        super(_miles);

        this.TAGNAME = "CityRoad";

    }



    @Override

    public double SpeedRate() {

        // TODO Auto-generated method stub

        System.out.println("In "+TAGNAME);

        return 0.75;

    }

}

 汽车用简单工厂模式封装下:

package com.jayfulmath.designpattern.bridge;



public class AutomobileFactory {

    

    public static Automobile CreateAutoMobile(int carType)

    {

        Automobile _mAuto = null;

        switch(carType)

        {

        case Automobile.TYPE_CAR:

            _mAuto = Car.getInstance();

            break;

        case Automobile.TYPE_MOTORCYCLE:

            _mAuto = Motorcycle.getInstance();

            break;    

        }

        return _mAuto;

    }

}
package com.jayfulmath.designpattern.bridge;



import com.jayfulmath.designpattern.main.BasicExample;



/*Bridge mode:当事物会随着很多方便变化而变化,我们可以把每个变化独立开来

 * 对于不同的方面,可以进行相应的

 * 

 * */



public class BridgeMain extends BasicExample {



    @Override

    public void startDemo() {

        /*1.highway 50km car

         *2.cityWay 30km motorcycle 

         *3.suburban 10km car 

         * */    

        double h1 = getRunTime(Road.TYPE_HIGHWAY,Automobile.TYPE_CAR,50);

        double h2 = getRunTime(Road.TYPE_CITY,Automobile.TYPE_MOTORCYCLE,30);

        double h3 = getRunTime(Road.TYPE_SUBURBAN,Automobile.TYPE_CAR,10);

        

        System.out.println("Total time is "+(h1+h2+h3));

        

    }

    

    private double getRunTime(int roadtype,int cartype,int pathlength)

    {

        double hour = 0;

        Road _mRoad = RoadFactory.CreateRoad(roadtype, pathlength);

        _mRoad.set_mAuto(AutomobileFactory.CreateAutoMobile(cartype));

        hour = _mRoad.Run();

        System.out.println("***************************************");

        return hour;

    }

}

结果:

distance of HighWay is 50 km

Car Run 50km/h at:In HighWay

HighWay spend time 0.67 hours

***************************************

distance of CityRoad is 30 km

Motorcycle Run 30km/h at:In CityRoad

CityRoad spend time 1.33 hours

***************************************

distance of Suburban is 10 km

Car Run 50km/h at:In Suburban

Suburban spend time 0.20 hours

***************************************

Total time is 2.2

实现系统有多角度分类,每个角度都有可能变化,把它们独立开来,不用继承的方式,而是用聚合的方式,可以避免类的爆炸。

你可能感兴趣的:(设计模式)