建设厅质监总站网站,网站页面框架设计影响用户,dreamwear做网站步骤,做网站充值犯法吗文章目录 案例引入介绍基本介绍类图出场角色 案例实现案例一类图代码实现 案例二类图代码实现 外观模式在Mybatis源码中的应用总结文章说明 案例引入
在家庭影院中#xff0c;要享受一场电影#xff0c;需要如下步骤#xff1a;
直接用遥控器#xff1a;统筹各设备开关开… 文章目录 案例引入介绍基本介绍类图出场角色 案例实现案例一类图代码实现 案例二类图代码实现 外观模式在Mybatis源码中的应用总结文章说明 案例引入
在家庭影院中要享受一场电影需要如下步骤
直接用遥控器统筹各设备开关开爆米花机放下屏幕开投影仪开音响开DVD选dvd去拿爆米花调暗灯光播放观影结束后关闭各种设备
【传统方案实现】
创建多个类分别表示各种机器然后每个类里面有相应机器的操作方式最后在主类中分别创建每种机器的对象并调用其方法来控制机器 缺点
如果设备较多操作流程会比较复杂在ClientTest 的main方法中创建各个子系统的对象并直接去调用子系统(对象)相关方法会造成调用过程混乱没有清晰的过程不利于在ClientTest 中去维护对子系统的操作
改进
定义一个高层接口给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法ready, play, pause, end)用来访问子系统中的一群接口也就是说 就是通过定义一个一致的接口(界面类)用以屏蔽内部子系统的细节使得调用端只需跟这个接口发生调用而无需关心其他子系统的内部细节
介绍
基本介绍
外观模式也叫“过程模式”外观模式为子系统中的一组接口提供一个一致的界面此模式定义了一个高层接口这个接口使得各个子系统更加容易使用使用外观模式可以为互相关联在一起的错综复杂的类整理出高层接口(API)。其中的Facade角色可以让系统对外只有一个简单的接口(API)。而且Facade 角色还会考虑到系统内部各个类之间的责任关系和依赖关系按照正确的顺序调用各个类。定义一个一致的接口用于屏蔽内部子系统的细节使得调用端只需跟这个接口发生调用而无需关心这个子系统的内部细节
类图 外观类(Facade)为调用端提供统一的调用接口外观类知道哪些子系统负责处理请求从而将调用端的请求代理给适当子系统对象子系统的集合指模块或者子系统处理Facade 对象指派的任务他是功能的实际提供者。如果有需要子系统之间可以互相调用调用者(Client)外观接口的调用者
出场角色
Facade(窗口)是代表构成系统的许多其他角色的“简单窗口”。Facade角色向系统外部提供高层接口(API)构成系统的许多其他角色这些角色各自完成自己的工作它们并不知道Facade角色。Facade角色调用其他角色进行工作但是其他角色不会调用Facade角色Client(请求者)负责调用 Facade角色 案例实现
案例一
类图 代码实现
【子系统DVD机】
package com.atguigu.facade;/*** DVD机*/
public class DVDPlayer {/*** 使用单例模式, 使用饿汉式*/private static DVDPlayer instance new DVDPlayer();public static DVDPlayer getInstance() {return instance;}/*** 开机*/public void on() {System.out.println( dvd on );}/*** 关机*/public void off() {System.out.println( dvd off );}/*** 播放*/public void play() {System.out.println( dvd is playing );}/*** 暂停*/public void pause() {System.out.println( dvd pause ..);}
}【子系统爆花机】
package com.atguigu.facade;/*** 爆米花机用于制作爆米花*/
public class Popcorn {private static Popcorn instance new Popcorn();public static Popcorn getInstance() {return instance;}public void on() {System.out.println( popcorn on );}public void off() {System.out.println( popcorn ff );}/*** 出爆米花*/public void pop() {System.out.println( popcorn is poping );}
}【子系统投影仪】
package com.atguigu.facade;/*** 投影仪*/
public class Projector {private static Projector instance new Projector();public static Projector getInstance() {return instance;}public void on() {System.out.println( Projector on );}public void off() {System.out.println( Projector off );}/*** 聚焦*/public void focus() {System.out.println( Projector is Projector );}}【子系统屏幕】
package com.atguigu.facade;/*** 屏幕*/
public class Screen {private static Screen instance new Screen();public static Screen getInstance() {return instance;}/*** 屏幕往上升*/public void up() {System.out.println( Screen up );}/*** 屏幕下降*/public void down() {System.out.println( Screen down );}}【子系统立体声】
package com.atguigu.facade;/*** 立体声*/
public class Stereo {private static Stereo instance new Stereo();public static Stereo getInstance() {return instance;}public void on() {System.out.println( Stereo on );}public void off() {System.out.println( Screen off );}public void up() {System.out.println( Screen up.. );}}【子系统灯光】
package com.atguigu.facade;/*** 灯光*/
public class TheaterLight {private static TheaterLight instance new TheaterLight();public static TheaterLight getInstance() {return instance;}public void on() {System.out.println( TheaterLight on );}public void off() {System.out.println( TheaterLight off );}/*** 灯光调暗*/public void dim() {System.out.println( TheaterLight dim.. );}/*** 灯光调亮*/public void bright() {System.out.println( TheaterLight bright.. );}
}【外观类】
package com.atguigu.facade;/*** 影院外观*/
public class HomeTheaterFacade {//--------------定义各个子系统对象----------------private TheaterLight theaterLight;private Popcorn popcorn;private Stereo stereo;private Projector projector;private Screen screen;private DVDPlayer dVDPlayer;/*** 构造器*/public HomeTheaterFacade() {super();this.theaterLight TheaterLight.getInstance();this.popcorn Popcorn.getInstance();this.stereo Stereo.getInstance();this.projector Projector.getInstance();this.screen Screen.getInstance();this.dVDPlayer DVDPlayer.getInstance();}/*** 操作分成 4 步*/public void ready() {popcorn.on();popcorn.pop();screen.down();projector.on();stereo.on();dVDPlayer.on();theaterLight.dim();}public void play() {dVDPlayer.play();}public void pause() {dVDPlayer.pause();}public void end() {popcorn.off();theaterLight.bright();screen.up();projector.off();stereo.off();dVDPlayer.off();}}【客户端】
package com.atguigu.facade;public class Client {public static void main(String[] args) {//这里直接调用外观类HomeTheaterFacade homeTheaterFacade new HomeTheaterFacade();System.out.println(-------------------------------准备步骤-------------------------------);homeTheaterFacade.ready();System.out.println(-------------------------------电影播放-------------------------------);homeTheaterFacade.play();System.out.println(-------------------------------观看结束-------------------------------);homeTheaterFacade.end();}}【运行】
-------------------------------准备步骤-------------------------------popcorn on popcorn is poping Screen down Projector on Stereo on dvd on TheaterLight dim..
-------------------------------电影播放-------------------------------dvd is playing
-------------------------------观看结束-------------------------------popcorn ff TheaterLight bright.. Screen up Projector off Screen off dvd off Process finished with exit code 0案例二
类图 代码实现
【数据库类】
package com.atguigu.facade.Sample.pagemaker;import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;public class Database {/***防止外部new出Database的实例所以声明为private方法*/private Database() {}/*** 根据数据库名获取Properties* param dbname* return*/public static Properties getProperties(String dbname) { String filename dbname .txt;Properties prop new Properties();try {prop.load(new FileInputStream(filename));} catch (IOException e) {System.out.println(Warning: filename is not found.);}return prop;}
}【数据文件】
hyukihyuki.comHiroshi Yuki
hanakohyuki.comHanako Sato
tomurahyuki.comTomura
mamoruhyuki.comMamoru Takahashi【Html文件输出】
package com.atguigu.facade.Sample.pagemaker;import java.io.IOException;
import java.io.Writer;/*** 用于编写简单的Web页面*/
public class HtmlWriter {private Writer writer;public HtmlWriter(Writer writer) { // 构造函数this.writer writer;}/*** 输出标题** param title* throws IOException*/public void title(String title) throws IOException {writer.write(html);writer.write(head);writer.write(title title /title);writer.write(/head);writer.write(body\n);writer.write(h1 title /h1\n);}/*** 输出段落* param msg* throws IOException*/public void paragraph(String msg) throws IOException { writer.write(p msg /p\n);}/*** 输出超链接* param href* param caption* throws IOException*/public void link(String href, String caption) throws IOException { paragraph(a href\ href \ caption /a);}/*** 输出邮件地址* param mailaddr* param username* throws IOException*/public void mailto(String mailaddr, String username) throws IOException { link(mailto: mailaddr, username);}/*** 结束输出HTML* throws IOException*/public void close() throws IOException { writer.write(/body);writer.write(/html\n);writer.close();}
} 【外观类】
package com.atguigu.facade.Sample.pagemaker;import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;public class PageMaker {/*** 防止外部new出PageMaker的实例所以声明为private方法*/private PageMaker() {}/*** 根据邮件地址和文件名来创建页面* param mailaddr* param filename*/public static void makeWelcomePage(String mailaddr, String filename) {try {Properties mailprop Database.getProperties(maildata);String username mailprop.getProperty(mailaddr);HtmlWriter writer new HtmlWriter(new FileWriter(filename));writer.title(Welcome to username s page!);writer.paragraph(欢迎来到 username 的主页。);writer.paragraph(等着你的邮件哦);writer.mailto(mailaddr, username);writer.close();System.out.println(filename is created for mailaddr ( username ));} catch (IOException e) {e.printStackTrace();}}
}【主类】
package com.atguigu.facade.Sample;import com.atguigu.facade.Sample.pagemaker.PageMaker;public class Main {public static void main(String[] args) {PageMaker.makeWelcomePage(hyukihyuki.com, welcome.html);}
}外观模式在Mybatis源码中的应用 总结
外观模式对外屏蔽了子系统的细节因此外观模式降低了客户端对子系统使用的复杂性外观模式对客户端与子系统进行解耦让子系统内部的模块更易维护和扩展通过合理的使用外观模式可以帮我们更好的划分访问的层次当系统需要进行分层设计时可以考虑使用Facade模式在维护一个遗留的大型系统时可能这个系统已经变得非常难以维护和扩展此时可以考虑为新系统开发一个Facade类来提供遗留系统的比较清晰简单的接口让新系统与Facade类交互提高复用性不能过多的或者不合理的使用外观模式判断使用外观模式好还是直接调用模块好如果子系统已经很简洁明了就不需要使用外观模式了如果子系统的调用很复杂就可以使用外观模式。要以让系统有层次利于维护为目的可以递归使用外观模式比如一开始有几个独立的Facade了它们分别负责不同的功能还可以在更外层提取一个Facade来将那几个独立的Facade整合起来
文章说明
本文章为本人学习尚硅谷的学习笔记文章中大部分内容来源于尚硅谷视频点击学习尚硅谷相关课程也有部分内容来自于自己的思考发布文章是想帮助其他学习的人更方便地整理自己的笔记或者直接通过文章学习相关知识如有侵权请联系删除最后对尚硅谷的优质课程表示感谢。本人还同步阅读《图解设计模式》书籍图解设计模式/(日)结城浩著;杨文轩译–北京:人民邮电出版社2017.1进而综合两者的内容让知识点更加全面