外观模式

外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

这种模式是我们日常开发经常用到的设计模式,也就是当我们对外提供服务时只是对每个服务提供一个接口,可能这个服务内部包含着相对复杂的算法与步骤,我们需要去调用多个服务甚至更多的Dao层去实现这个服务的需求,我们无意中就 用到了这种模式。看下代码实现你就知道是什么了。

子系统A的方法:

public class SystemA {
    public void add(){
        System.out.println("添加系统A数据");
    }
    public void update(){
        System.out.println("修改系统A数据");
    }
    public void edit(){
        System.out.println("删除系统A数据");
    }
}

子系统B的方法:

public class SystemB {
    public void add(){
        System.out.println("添加系统B数据");
    }
    public void update(){
        System.out.println("修改系统B数据");
    }
    public void edit(){
        System.out.println("删除系统B数据");
    }
}

服务接口:

public interface Service {
    public void addSomething();
    public void upadteSomething();
    public void editSomething();
}

服务接口实现与测试Client

public class ServiceIml implements Service {
    SystemA a = new SystemA();
    SystemB b = new SystemB();
    @Override
    public void addSomething() {
        System.out.println("do something");
        a.add();
        System.out.println("do something");
        b.add();
        System.out.println("do something");
        System.out.println("添加成功");
    }
    @Override
    public void upadteSomething() {
        System.out.println("do something");
        a.update();
        System.out.println("do something");
        b.update();
        System.out.println("do something");
        System.out.println("修改成功");

    }
    @Override
    public void editSomething() {
        System.out.println("do something");
        a.edit();
        System.out.println("do something");
        b.edit();
        System.out.println("do something");
        System.out.println("删除成功");
    }
    //client
    public static void main(String[] args) {
        Service s = new ServiceIml();
        s.addSomething();
        s.upadteSomething();
        s.editSomething();
    }
}

测试结果:

do something
添加系统A数据
do something
添加系统B数据
do something
添加成功
do something
修改系统A数据
do something
修改系统B数据
do something
修改成功
do something
删除系统A数据
do something
删除系统B数据
do something
删除成功

这就是所谓的外观模式。外观模式是一个高频率使用的设计模式,它的精髓就在于封装二字。通过一个高层次结构为用户提供统一的 API 入口,使得用户通过一个类型就基本能够操作整个系统,这样减少了用户的使用成本,也能够提升系统的灵活性。

外观类遵循了一个很重要设计模式原则:迪米特原则(最少知识原则),它让客户端依赖于最少的类,直接依赖外观类而不是依赖于所有的子系统类。

迪米特原则:如果两个类不必彼此直接连通,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。也就是一个对象应该对其他对象保持最少的了解。

优点:

  • 对客户程序隐藏子系统细节,因而减少了客户对于子系统的耦合,能够拥抱变化;
  • 外观类对子系统的接口封装,使得系统更易于使用;
  • 更好的划分访问层次,通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到外观类中,这样既方便客户端使用,也很好地隐藏了内部的细节。

    缺点:

  • 外观类没有遵循开闭原则,当业务出现变更时,可能需要直接修改外观类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值