Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > 《设计模式》学习笔记--外观Facade
【标  题】:《设计模式》学习笔记--外观Facade
【关键字】:--,Facade
【来  源】:http://blog.csdn.net/qinysong/archive/2006/08/16/1076115.aspx

《设计模式》学习笔记--外观Facade

Your Ad Here

 

1、官方描述:
    为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
 
2、实例讨论:
我们可以通过电视机遥控器的作用来理解该模式的价值和作用,电视机的内部很复杂,包括频道调节和处理系统、图像色彩调节处理系统、声音调节系统等等,每个系统又包括多个类进行操作,如果把这些系统都暴露给用户使用,而不是通过遥控器进行封装,那么每个电视机用户都可能需要进行一个《电视机操作使用》培训才能使用了。相对而言,现在通过遥控器,电视机用户在很短的时间就可以掌握常规的使用方法。
电视机遥控器及电视机内部的结构图如下所示:
 
 
3、适用性:
1)为复杂的子系统提供一个简单的接口,子系统可能为了通用性目标,实现为可以根据使用情况进行各种定制的复杂系统,可是按照2/8法则,80%的用户可能只是使用简单的20%的功能,这样通过提供Facade对子系统进行高层概括,便极大的简化了这80%用户的易用性;
2)子系统存在多种实现,通过Facade在用户和子系统内部实现之间进行分离,减弱了用户对子系统的实现依赖性,这样就便于对子系统进行扩展和维护;
3)降低子系统之间的依赖性;
 
4、实现特征:
1)Facade不提供新的功能,仅作为子系统的高层概括和代理;
2)子系统不知道Facade的存在,即子系统中没有对Facade的关联,而只是Facade了解子系统内部结构;
3)Facade原则上并不禁止用户直接访问子系统中的对象,Facade在子系统的可定制性上层建立了一个简单视图;
 
5、Java代码演示:
下面代码演示了电视机遥控器的程序结构:
 
1)子系统部分代码:
类ChannelManager(频道管理器),负责电视频道的相关调整和操作:
 
package qinysong.pattern.facade.subsystem;

public class ChannelManager {
  
  
//当前频道编号
  private int currentChannelNumber;
  
  
//设置频道(可能还会调用其它辅助类)
  public void chooseChannel(int channelNumber) {
    System.out.println(
"ChannelManager.chooseChannel(): 设置频道(可能还会调用其它辅助类)");
    currentChannelNumber 
= channelNumber;
  }

  
  
//上调频道(可能还会调用其它辅助类)
  public void upSkipChannel(){
    System.out.println(
"ChannelManager.upSkipChannel(): 上调频道(可能还会调用其它辅助类)");
    currentChannelNumber
++;
  }

  
  
//下调频道(可能还会调用其它辅助类)
  public void downSkipChannel(){
    System.out.println(
"ChannelManager.downSkipChannel(): 下调频道(可能还会调用其它辅助类)");
    currentChannelNumber
--;
  }

  
  
public void otherMethod(){
    System.out.println(
"ChannelManager.otherMethod(): 其他方法");
  }

}

 
类AudioManager(声频管理器),负责声音的相关调整和操作,该类还用到其他类,如类Volume等:
 
package qinysong.pattern.facade.subsystem;

public class AudioManager {
  
  
//当前音量
  private Volume currentVolume;

  
//加重音量
  public void aggravateVolume(){
    System.out.println(
"AudioManager.aggravateVolume(): 加重音量(可能还会调用其它辅助类)");
    currentVolume.aggravate();
  }


  
//降低音量
  public void weakenVolume(){
    System.out.println(
"AudioManager.weakenVolume(): 降低音量(可能还会调用其它辅助类)");
    currentVolume.weaken();
  }


  
public void otherMethod(){
    System.out.println(
"AudioManager.otherMethod(): 其他方法");
  }

}
 
类ColorManager(色彩管理器),负责图像色彩的相关调整和操作,该类还用到其他类,如类Color等:
 
package qinysong.pattern.facade.subsystem;

public class ColorManager {
  
  
//当前色彩度
  private Color currentColor;

  
//加重色彩度
  public void aggravateColor(){
    System.out.println(
"ColorManager.aggravateColor(): 加重色彩度(可能还会调用其它辅助类)");
    currentColor.aggravate();
  }


  
//降低色彩度
  public void weakenColor(){
    System.out.println(
"ColorManager.weakenColor(): 降低色彩度(可能还会调用其它辅助类)");
    currentColor.weaken();
  }


  
public void otherMethod(){
    System.out.println(
"ColorManager.otherMethod(): 其他方法");
  }

}
 
2)视图代码:
类RemoteDevice(遥控器),对电视机的日常使用操作进行封装,以便用户使用:
 
package qinysong.pattern.facade;

import qinysong.pattern.facade.subsystem.AudioManager;
import qinysong.pattern.facade.subsystem.ColorManager;
import qinysong.pattern.facade.subsystem.ChannelManager;

public class RemoteDevice {  
  
  
private AudioManager audioManager;
  
private ColorManager colorManager;
  
private ChannelManager channelManager;
  
  
//加重音量
  public void aggravateVolume(){
    
//取得 audioManager
    audioManager.aggravateVolume();
  }

  
//降低音量
  public void weakenVolume(){
    
//取得 audioManager
    audioManager.weakenVolume();
  }

  
  
//加重色彩度
  public void aggravateColor(){
    
//取得 colorManager
    colorManager.aggravateColor();
  }

  
//降低色彩度
  public void weakenColor(){
    
//取得 colorManager
    colorManager.weakenColor();
  }

  
  
//设置频道(可能还会调用其它辅助类)
  public void chooseChannel(int channelNumber) {
    
//取得 channelManager
    channelManager.chooseChannel(channelNumber);
  }


  
//上调频道(可能还会调用其它辅助类)
  public void upSkipChannel(){
    
//取得 channelManager
    channelManager.upSkipChannel();
  }


  
//下调频道(可能还会调用其它辅助类)
  public void downSkipChannel(){
    
//取得 channelManager
    channelManager.downSkipChannel();
  }

}
 
jboss中使用log4j:【上一篇】
例子1:【下一篇】
【相关文章】
  • JBPM工作流demo--websale的开发 (2)
  • Hadoop笔记--不需要分布式编程经验地分布式编程
  • CCNP学习的笔记---VTP篇
  • 内外兼修 全面防护--CP Secure进军中国市场
  • 中断相关代码分析 -- 软中断
  • create TAGS for emacs -- etags
  • ALSA 0.9.0 HOWTO -- 基本PCM音频
  • Linux程序设计入门--进程介绍
  • Linux Device Drivers学习笔记2--Chapter.2 Building and Running Modules
  • 粒子系统应用--烟花模拟
  • 【随机文章】
  • 我爱瞎逛,我爱煮饭。
  • PHP 中文手册5月最新版(chm)
  • 应用JDOM处理数据库到XML转换的JSP实现 (一)
  • ST350-6 sunVTS system Diagnostics
  • 如何解决流媒体服务器的缓冲问题,启用多个Helix Server的方法!
  • Tru64下用TAPE 备份目录
  • Smile
  • MySQL基本使用方法
  • 点评主流开源数据库的技术特点
  • (三)信道的复用技术
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.