美文网首页设计模式
外观模式(Facede)

外观模式(Facede)

作者: 秀儿2020 | 来源:发表于2020-07-22 09:37 被阅读0次

    定义

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

    本质

    封装交互,简化调用。

    登场角色

    • Facede(窗口)

      定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象。

    • 模块

      接收Facade对象的委托,真正实现功能,各个模块之间可能会有交互。

    示例代码

    public interface Phone {
        void dail(); //拨打
        void hangup();//挂断
    }
    
    public class PhoneImpl implements Phone{
        @Override
        public void dail() {
            System.out.println("拨号");
        }
    
        @Override
        public void hangup() {
            System.out.println("挂断");
        }
    }
    
    
    public interface Camera {
        void open();
        void takePicture();
        void close();
    }
    
    
    public class SamsungCamera implements Camera{
        @Override
        public void open() {
            System.out.println("打开相机");
        }
    
        @Override
        public void takePicture() {
            System.out.println("拍照");
        }
    
        @Override
        public void close() {
            System.out.println("关闭相机");
        }
    }
    
    
    
    public class MobilePhone {
        private Phone phone = new PhoneImpl();
        private Camera camera = new SamsungCamera();
    
        public void dail(){
            phone.dail();
        }
    
        public void videoChat(){
            camera.open();
            phone.dail();
        }
    
        public void hangup(){
            phone.hangup();
        }
    
        public void takePickture(){
            camera.open();
            camera.takePicture();
        }
    
        public void closeCamera(){
            camera.close();
        }
    }
    
    public class Main {
        public static void main(String[] args){
            MobilePhone mobilePhone = new MobilePhone();
            System.out.println("=======拍照=======");
            mobilePhone.takePickture();
            System.out.println("=======视频通话=======");
            mobilePhone.videoChat();
        }
    }
    
    

    运行结果

    =======拍照=======
    打开相机
    拍照
    =======视频通话=======
    打开相机
    拨号
    

    功能

    提供统一的封装接口,将子系统的逻辑、交互隐藏起来,为用户提供一个高层次的接口,使得系统更加易用,同事也对外隐藏了具体的实现,这样即使子系统发生了改变,用户也不会感知到,因为用户使用的是高层接口,内部的变化对用户不可见。

    优点

    • 松散耦合,松散了客户端和子系统的耦合关系。
    • 简单易用,客户端不需要了解子系统内部的实现,也不需要跟子系统内部的多个模块进行交互,只需要更外观交互即可。
    • 更好的划分访问的层次。有些方法是对系统外开放的,有些方法是仅对系统内使用的,使用外观模式可以将可对外调用的功能集中到外观模式中,也很好的隐藏了实现的细节。

    缺点

    • 过多的或者不太合理的Facede或让人疑惑,到底是调用外观呢还是直接调用内部实现呢。

    何时使用

    • 为一个复杂的子系统提供一个简单的接口。
    • 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,可以让他们仅通过外观模式相互调用,简化他们之间的依赖关系。

    相关文章

      网友评论

        本文标题:外观模式(Facede)

        本文链接:https://www.haomeiwen.com/subject/fnfzkktx.html