设计模式之外观模式
1.定义:
为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
2.引入:
我们以开车时候自动挡和手动挡加速换挡为例:
手动挡的加速换挡过程:松油门(freeAccelerator)-->踩离合踏板(pushClutch)-->换挡(shiftGear)-->放离合(freeClutch)-->踩油门(pushAccelerator)
代码实现:
public class User {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car car = new CarImpl();
car.pushClutch();
car.shiftGear();
car.freeClutch();
}
}
interface Car{
//踩离合
public void pushClutch();
//换挡
public void shiftGear();
//松离合
public void freeClutch();
}
class CarImpl implements Car{
@Override
public void pushClutch() {
System.out.println("踩离合");
}
@Override
public void shiftGear() {
System.out.println("换挡");
}
@Override
public void freeClutch() {
System.out.println("松离合");
}
}
自动挡的加速换挡过程:踩油门---->自动变速箱(踩离合踏板(pushClutch)-->换挡(shiftGear)-->放离合(freeClutch))--->踩油门
代码实现:
public class User {
public static void main(String[] args) {
// TODO Auto-generated method stub
AutoShiftCar car = new AutoShiftCar();
car.autoShift();
}
}
class AutoShiftCar{
Car car = new CarImpl() ;
public void autoShift() {
car.pushClutch();
car.shiftGear();
car.freeClutch();
}
}
interface Car{
//踩离合
public void pushClutch();
//换挡
public void shiftGear();
//松离合
public void freeClutch();
}
class CarImpl implements Car{
@Override
public void pushClutch() {
System.out.println("踩离合");
}
@Override
public void shiftGear() {
System.out.println("换挡");
}
@Override
public void freeClutch() {
System.out.println("松离合");
}
}
从类图中和代码中可以看出,自动挡的变速箱就是讲手动挡变速箱的换挡过程封装到一个方法中,这样用户使用的时候就不需要知道具体的换挡的过程,只需要去调用自动换挡的方法autoShift,它就会把整个换挡的三个方法(pushClutch---shifGear---freeClutch)组合起来。
3.说明
外观模式就是使用一个接口group将一组特定顺序的接口(A--B--C)组合起来,当需要调用特定顺序的一组接口(A--B--C)的时候,就只需要调用对于的那个接口group就行;组合的接口顺序发生改变时(A--B--C修改为C--B--A),我们也只需要去修改接口group,引用到group的地方就会跟着被修改。