设计模式之外观模式

22 篇文章 0 订阅
17 篇文章 0 订阅

外观模式定义

外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用

详解外观模式

外观模式的意图是简化接口。当实现某个行为时,需要依赖子系统的许多类,而且使用复杂,就可以考虑使用外观模式,提供一个简化并统一的接口。这样客户只需对外观类编程,从而将客户从一个复杂的子系统中解耦。

从下面的简易的类图可以更清晰的理解外观模式:
这里写图片描述

示例

本例是一个智能手机示例。子系统包括Phone类、Internet类、Music类、MusicPlayer类,它们分别用于打电话、上网、播放音乐。利用外观模式新建了一个简化的接口:Smartphone类,Smartphone类统一对外服务。


示例类图

这里写图片描述


程序

Phone类

public class Phone {
    public void callPhone(String phoneNumber) {
        System.out.println("拨通电话 " + phoneNumber);
    }

    public void endPhone() {
        System.out.println("挂断电话");
    }
}

Internet类

public class Internet {

    public void openWeb(String webName) {
        System.out.println("打开网站:" + webName);
    }

    public void endWeb() {
        System.out.println("关闭网站");
    }

    public Music downloadMusic(String musicName) {
        System.out.println("下载音乐:" + musicName);
        String content = "网络下载音乐:" + musicName;
        return new Music(musicName, content);
    }

}

MusicPlayer类

public class MusicPlayer {

    public void playMusic(String musicName) {
        Music music = searchMusic(musicName);
        System.out.println("播放音乐:" + music.getContent());
    }

    public void endPlay() {
        System.out.println("关闭音乐");
    }

    private Music searchMusic(String musicName) {
        //模拟本地是否有该音乐,如果没有则通过Internet类下载音乐
        Random random = new Random();
        if (random.nextInt(4) % 2 == 0) {
            String content = "本地音乐:" + musicName;
            return new Music(musicName, content);
        }else {
            Internet internet = new Internet();
            return internet.downloadMusic(musicName);
        }
    }

}

Music类

public class Music {
    private String name;
    private String content;

    public Music(String name, String content) {
        this.name = name;
        this.content= content;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

Smartphone类

public class SmartPhone {
    private Phone phone = new Phone();
    private Internet internet = new Internet();
    private MusicPlayer musicPlayer = new MusicPlayer();

    public void callPhone(String phoneNumber) {
        phone.callPhone(phoneNumber);
    }

    public void endPhone() {
        phone.endPhone();
    }

    public void openWeb(String webName) {
        internet.openWeb(webName);
    }

    public void endWeb() {
        internet.endWeb();
    }

    public void playMusic(String musicName) {
        musicPlayer.playMusic(musicName);
    }

    public void endMusic() {
        musicPlayer.endPlay();
    }

}

测试类TestFacade

public class TestFacade {
    public static void main(String [] args) {
        SmartPhone smartPhone = new SmartPhone();
        smartPhone.callPhone("18888888888");
        smartPhone.endPhone();

        smartPhone.openWeb("https://github.com/ByrsH");
        smartPhone.endWeb();

        smartPhone.playMusic("山丘");
        smartPhone.endMusic();
    }
}

输出:

拨通电话 18888888888
挂断电话
打开网站:https://github.com/ByrsH
关闭网站
下载音乐:山丘
播放音乐:网络下载音乐:山丘
关闭音乐

外观模式符合面向对象设计中的“最少知识”原则,也叫“墨忒耳法则(Law of Demeter)”。该原则告诉我们要减少对象之间的交互,只和你的“密友”谈话。

代码下载:https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/facade

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值