到 Google 资讯主页   
EasyJF首页   资料   源码   软件    论坛   网站    
   使用帮助    
    该信息为本站MyRSS系统缓存内容,部分图片及附件有可能无法正常使用.easyjf.comexpert.blogjava.net无关,不对该信息负责.通过http://www.blogjava.net/zellux/archive/2007/10/15/153094.html访问该信息的原始内容.
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   
Facade模式
作者:ZelluX 来源:expert.blogjava.net  发布时间:2007-10-15 22:34:27.657

这两星期里得看懂Robocode代码,然后自己做个类似小霸王坦克大战的游戏出来@@ 只能老老实实啃了

首先要了解了一些常用的设计模式,由于时间有限,就不去看四人帮的那本书了,偷懒google别人的文章快速入门算了

Robocode中有不少Manager类,其实就是Façade模式的应用。

http://www.fish888.com/Facade-t126336


1、官方描述:

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

   

2、实例讨论:

我们可以通过电视机遥控器的作用来理解该模式的价值和作用,电视机的内部很复杂,包括频道调节和处理系统、图像色彩调节处理系统、声音调节系统等等,每个系统又包括多个类进行操作,如果把这些系统都暴露给用户使用,而不是通过遥控器进行封装,那么每个电视机用户都可能需要进行一个《电视机操作使用》培训才能使用了。相对而言,现在通过遥控器,电视机用户在很短的时间就可以掌握常规的使用方法。
电视机遥控器及电视机内部的结构图如下所示:

 

 3、适用性:
1
)为复杂的子系统提供一个简单的接口,子系统可能为了通用性目标,实现为可以根据使用情况进行各种定制的复杂系统,可是按照2/8法则,80%的用户可能只是使用简单的20%的功能,这样通过提供Facade对子系统进行高层概括,便极大的简化了这80%用户的易用性;
2
)子系统存在多种实现,通过Facade在用户和子系统内部实现之间进行分离,减弱了用户对子系统的实现依赖性,这样就便于对子系统进行扩展和维护;
3
)降低子系统之间的依赖性;

   

4、实现特征:
1
Facade不提供新的功能,仅作为子系统的高层概括和代理;
2
)子系统不知道Facade的存在,即子系统中没有对Facade的关联,而只是Facade了解子系统内部结构;
3
Facade原则上并不禁止用户直接访问子系统中的对象,Facade在子系统的可定制性上层建立了一个简单视图;

 5Java代码演示:
下面代码演示了电视机遥控器的程序结构:

 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();
  }
}

   



ZelluX 2007-10-15 21:26 发表评论

 
相关文章
 
页面功能  【加入收藏】 【推荐给朋友】 【字体:  】 【关闭】   


EasyJF.com 2006 隐私政策 使用EasyJF前必读