Windows环境下策略模式与Java界面布局

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下策略模式与Java界面布局的问题。

不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式,无从下手。为什么?因为你看的都是理论书籍。

我今天就在Windows操作系统上安装好JAVA的IDE编程工具,并通过动手来搞明白。

Java SE(Java Standard Edition,Java 标准版)是Java技术的核心和基础,是Java ME和Java EE编程的基础 [1] 。Java SE是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现的Hot Java浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Java applet。

jdk的三大版本如下:

Java SE(J2SE,Java 2 Platform Standard Edition,标准版):Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。

Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版):Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。

Java ME(J2ME,Java 2 Platform Micro Edition,微型版):Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

JVM、JRE和JDK的关系如下:

JVM:Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。

JRE:Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包。如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

JDK:Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等。

如果还是没看懂,直接上图吧。

所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。实现原理其实是Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。

然后我们还需要认识一下Java里面的布局问题,这里有一些概念:BorderLayout、FlowLayout、GridLayout、GridBagLayout 和 CardLayout。Java 程序通过jvm可以很好的移植到其他平台上,但是java 生成的图形界面样式,在不使用布局的情况下,往往需要重新设定大小,才能在新的平台上调整到最佳样式。这是由于组件的最佳大小往往是与平台相关的。不同平台上相同的内容大小可能不一样.java专门提供了LayoutManager(布局管理器)来更好的进行布局管理,使组件的大小和位置调整到最佳。

做过图形界面绘制工作的人基本都知道这个容器的概念。如果第一次接触的话,可以简单的直接把他理解为是一块面板,可以在上面画控件的东西。 常用的Container 包括:window panel scrollPane 其中Window 又包括 Frame(窗体) Dialog(对话框)。其中5代表 awt布局有5种分别是 FlowLayout 、BorderLayout、GridLayout、GridBagLayout、CardLayout 。 下边依次来介绍每种布局。

(1)FowLayout 流布局

什么是流布局呢,flow 代表流 水流,FlowLayout也就是就是控件就像流水(队列)一样向某个排列,当遇到边界的时候,就折回从下一行继续排队。就像军训的时候人员一排一排的站好,当一排人数满的时候,就另起一行继续排队。默认情况下,FlowLayout 布局管理器都是从左向右排列所有组件的。

2)BorderLayout 边框布局

BorderLayout 也就是把容器通过边界划分成几个区域,这几个区域各自始终存在, 并且数量始终为5个:东、西、南、北、中,区域的相对位置如下图.添加的控件可以被指定放置在区域中的任何一个位置。

(3)GridLayout 网格布局

这种布局会将整个容器划分成M行*N列的网格。在向这种容器中添加控件时,会以向左后右,先上后下的顺序添加控件。 而不能在指定的位置中添加控件,换言之控件之间不能留有空白。

(4)GridBagLayout

GridBagLayout也是一种表格,但是可以通过设定规则更自由的将控件绑定到容器上。将容器切割为若干个小的格子Cell,然后向这些Cell中添加控件,同时可以在某一个方向上连续的几个Cell进行拼接,组成一个大的Cell放置控件。

(5)CardLayout

CardLayout 布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片(每个卡片其实就是一个组件),每次只有最上面的那个 Component 才可见。

好了,再回到设计模式,Java SE中的容器布局管理是策略模式的一个经典应用实例,其基本结构如图所示。

在Java SE开发中,用户需要对容器对象Container中的成员对象(例如按钮、文本框等GUI控件)进行布局(Layout),在程序运行期间由客户端动态决定一个Container对象如何布局。Java语言在JDK中提供了几种不同的布局方式,封装在不同的类中,例如BorderLayout、FlowLayout、GridLayout、GridBagLayout 和 CardLayout等。在图中,Container类充当环境角色Context, LayoutManager作为所有布局类的公共父类扮演了抽象策略角色,它给出所有具体布局类所需的接口,而具体策略类是LayoutManager的子类,也就是各种具体的布局类,它们封装了不同的布局方式。

任何人都可以开发自己的布局类,只需要将自己设计的布局类作为LayoutManager的子类即可。在JDK中,Container类的代码片段如下:

public class Container extends Component{
   ......
  LayoutManager layoutMgr;
   ......
public void setLayout(LayoutManager mgr){
  layoutMgr = mgr;
   ......
   }
   ......
}

上述代码中可以看出,Container作为环境类-它针对抽象策略类 LayoutManager 进行编程。根据里氏代换原则,用户在使用时只需要在 setLayout()方法中传入一个具体布局对象即可,而无须关心该布局对象的具体实现。

策略模式用于算法的自由切换和扩展,它是应用较为广泛的设计模式之一。策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法来解决某一问题,同时可以方便地更换算法或者增加新的算法,只要涉及算法的封装、复用和切换都可以考虑使用策略模式。

策略模式的优点主要如下:(1)策略模式提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。(2)策略模式提供了管理相关的算法集的办法。策略类的等级结构定义了一个算法或行为集,恰当地使用继承可以把公共的代码移到抽象策略类中,从而避免重复的代码。(3)策略模式提供了一种可以替换继承关系的办法。如果不使用策略模式,那么使用算法的环境类就可能会有一些子类,每一个子类提供一种不同的算法。但是这样一来算法的使用就和算法本身混在一起,不符合单一职责原则,决定使用哪一种算法的逻辑和该算法本身混合在一起,从而不可能再独立演化;而且使用继承无法实现算法或行为在程序运行时的动态切换。(4)使用策略模式可以避免多重条件选择语句。多重条件选择语句不易维护,它把采取哪一种算法或行为的逻辑与算法或行为本身的实现逻辑混合在一起,将它们全部硬编码在一个庞大的多重条件选择语句中,比直接继承环境类的办法还要原始和落后。(5)策略模式提供了一种算法的复用机制,由于将算法单独提取出来封装在策略类中,因此不同的环境类可以方便地复用这些策略类。

策略模式的缺点主要如下:(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法。换而言之,策略模式只适用于客户端知道所有算法或行为的情况。(2)策略模式将造成系统产生很多具体策略类,任何细小的变化都将导致系统要增加一个新的具体策略类。(3)无法同时在客户端使用多个策略类·也就是说,在使用策略模式时客户端每次只能使用一个策略类,不支持使用一个策略类完成部分功能后再使用另一个策略类完成剩余功能的情况。

在以下情况下可以考虑使用策略模式:(1)一个系统需要动态地在几种算法中选择一种,那么可以将这些算法封装到一个个的具体算法类中,而这些具体算法类都是一个抽象算法类的子类。换而言之,这些具体算法类均有统一的接口.根据里氏代换原则和面向对象的多态性,客户端可以选择使用任何一个具体算法类,并只需要维持一个数据类型是抽象算法类的对象。(2)一个对象有很多行为,如果不用恰当的模式,这些行为则只好使用多重条件选择语句来实现。此时使用策略模式把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句。(3)不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法与相关的数据结构,可以提高算法的保密性与安全性。

总结

1.在策略模式中定义了一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户而变化。策略模式又称为政策模式,它是一种对象行为型模式。

2.策略模式包含环境类、抽象策略类和具体策略类3个角色。其中,环境类是使用算法的角色,它在解决某个问题(即实现某个功能)时可以采用多种策略;抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类;具体策略类实现了在抽象策略类中声明的算法。

3.策略模式的优点主要是用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为;提供了一种管理相关的算法族的办法和替换继承关系的办法,可以避免多重条件选择语句;此外,策略模式还提供了一种算法的复用机制。其缺点主要是客户端必须知道所有的策略类,并自行决定使用哪一个策略类;将造成系统产生很多具体策略类;而且无法同时在客户端使用多个策略类。

4.策略模式适用于以下环境:一个系统需要动态地在几种算法中选择一种;避免使用难以维护的多重条件选择语句;不希望客户端知道复杂的、与算法相关的数据结构。

各位小伙伴,这次我们就说到这里,下次我们再深入研究windows环境下的各类设计模式实现。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值