首页 > 编程语言 > 详细

java设计模式学习笔记第四章

时间:2016-03-07 18:44:52      阅读:176      评论:0      收藏:0      [点我收藏+]

外观模式(Facade)

外观模式的意图是为子系统提供一个接口,便于它们的使用。

示例类则用于展示如何使用类或子系统。

挑战4.1写出示例类和外观类的亮点区别。

个人认为示例类就是为使用此类做了一个示例,供参考。外观类是提供接口,有工具类的特点。

正确答案:

  1.示例通常是一个单独运行的应用程序,而外观不是。

  2.示例通常包含了样本数据,而外观则没有。

  3.外观通常是可配置的,示例不是。

  4.外观用在产品代码中,示例不是。

正确答案感觉很官方啊,我是没有完全的深入体会。只能继续往下看深入学习。

重构到外观模式

下面模拟了放哑弹的抛物线。

技术分享

showFlight类混杂了三个功能。一,为飞行路径提供面板。二,作为一个完整的应用程序,需要将飞行路径的面板显示在一个具有标题的边框内,三,计算飞行路径的抛物线。

showFlight类可以工作,然而根据关注点分离的原则,我们应该将其重构为多个单独的类,以提高可维护性及可重用性。做了以下改变:

  1.引入一个Function类,它定义了f()方法,接收一个double值(时间值),返回一个double值(函数的值)。

  2.将ShowFlight类移入PlotPanel类,改为使用Function对象来获取x和y的值。定义PlotPanel构造函数接收两个Function实例和绘图所需的点数。

  3.将createTitlePanel()方法移到已存在的UI工具类中,来实现一个像当前ShowFlight类那样带有标题的面板。

挑战4.4完成图,用以展示将ShowFlight重构为三个类的代码:Function类,实现两个参数功能的PloatPanel和一个UI外观类。在你的重新设计中,让类ShowFlight2为获取y值创建一个Function,并让main()方法启动程序。

我写的版块

技术分享

 

正确答案:

技术分享

本书的代码将UI方法声明为非静态的,这样UI的子类就可以重写他们,从而能够为用户界面的构建提供不同的工具实现。为了让标准的用户界面是可用的,设计参考了单例的NORMAL对象。

重构之后,Function类定义了参数方程。倘若要创建一个包含Function类与其他类型的com.oozinoz.function包,则Function.java的核心代码可能是:

public abstract double f(double t);

经过重构,PlotPanel类只拥有了一个职责:显示一对参数方程,代码如下:

 1 public class PlotPanel extends JPanel{
 2     private int points;
 3     private int[] xpoints;
 4     private int[] ypoints;
 5 
 6     private Function xFunction;
 7     private Function yFunction;
 8     public PlotPanel(int nPoint,Function xFunc,Function yFunc){
 9         points = nPoint;
10         xpoints = new int[points];
11         ypoints = new int[points];
12         xFunction = xFunc;
13         yFunction = yFunc;
14         setBackground(Color.WHITE);
15     }
16     protected void paintComponent(Graphics graphics){
17         double w = getWidth() - 1;
18         double h = getHeight() - 1;
19         for(int i = 0; i < points; i ++){
20             double t = ((double)i)/(points - 1);
21             xPoints[i] = (int)(xFunction.f(t)*w);
22             yPoints[i] = (int)(h*(1 - yFunction.f(t)));
23         }  
24         graphics.drawPolyline(xPoints,yPoints,points);
25     }
26 }

注意,PlotPanel类目前是com.oozinoz.ui包的一部分,和UI类处于同一位置。对ShowFlight类进行重构后,UI类也拥有了createTitledPanel和createTitledBorder方法,UI类逐步演化为外观类。使之更容易使用java控件。

使用这些控件的应用程序可能是一个很小的类,该类唯一的职责就是对这些控件进行布局并显示它们。

public class ShowFlight2{
    public static void main(String[] args){
        PlotPanel p = new PlotPanel(
                101,
                new T(),
                new ShowFlight().new YFunction());
         p.setPreferredSize(new Dimension(300,200));
         
         JFrame frame = new JFram("Flight path for shell Duds");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.getContentPane().add(
                  UI.NORMAL.createTitledPanel("Flight path",p));
         frame.pack();
         frame.setVisible(true);
    }
    private class YFunction extends Function{
        public YFunction(){
            super(new Function[]{});
        }
         public double f(double t){
              //当t等于0或1时,y为0;当t等于0.5时,y为1
              return 4*t*(1-t);
         }
    }
}

 

 1 public class UI{
 2     public static final UI NORMAL = new UI();
 3     protected Font font = new Font("Book Antiqua",Font.PLAIN,18);
 4     //省略部分实现
 5     public Font getFont(){
 6         return font;
 7     }
 8     public TitledBorder createTitledBorder(String title){
 9         TitleBorder border = BorderFactory.createTitledBorder(
10             BorderFactory.createBevelBorder(BevelBorder.RAISED),
11             title,
12             TitleBorder.LEFT,
13             TitleBorder.TOP);
14         border.setTitleColor(Color.black);
15         border.setTitleFone(getFont());
16         return border;
17     }
18     public JPanel createTitledPanel(String title,JPanel in){
19         JPanel out = new JPanel();
20         out.add(in);
21         out.setBorder(createTitledBorder(title));
22         return out;
23     }
24 }    

对代码理解:

    PlotPanel类接收Function类,来计算抛物线的点。然后画出来。然后把PlotPanel以参数的形式扔进UI类的createTitlePanel方法。改方法就会创建出来代标题的样板了。ShowFlight2好像是一个示例(demo),创建一个JFrame容器来装UI创建出来的带标题的面板。然后JFrame展现出来。功能都由PlotPanel,Function,UI类实现。并且Function是最底层的实现,PlotPanel是Function的上一层。封装了它,创建出了JPanel类。然后UI用创建出来的JPanel类。来实现最外层的功能。UI是最接近用户的。也就是程序员看得到的,可以调用的,它很简单。UI.NORMAL.createTitledPanel("Flight path",p)一句话就把代标题的面板创建出来了。然后测试的demo类用JFrame展示它。

总结

整体而言应该对子系统中的类进行重构,知道每个类都有一个明确的目的。这可以使你的代码更容易维护,但也可能让使用该子系统的用户变得无所适从。为了让调用这些代码的开发人员更方便,可以为子系统提供示例程序或者外观类。通常,示例程序可以独立运行,却无法重用,仅用于演示使用子系统的方法。外观类则是可配置、可重用的类,提供了高层次的接口,是的子系统的使用更加方便。

java设计模式学习笔记第四章

原文:http://www.cnblogs.com/conglanjun/p/5247212.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!