李港 杨道武 彭逸凡 董泽民 肖卓宇
摘要:设计模式提供一种可复用的解决方案,并有助于提高软件研发的效率。但随着GOF设计模式成熟化与规模化,现有23种经典设计模式已不能满足业务需求,为此,众多学者对传统GOF设计模式进行了演化,该文致力于演化后设计模式的研究,提出了设计模式变体的概念,研究了变体特征,以装饰者模式与代理模式为例,给出了具体的研究实现,取得了较好的研究效果,说明了设计模式变体值得进一步深入研究。
关键词:设计模式;设计模式变体;方案演化;设计模式分类;GOF
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)31-0085-02
1 概述
设计模式是一套经典的,并得到了广大软件开发人员认可的可复用设计方案[1-3]。目前,(Gang of four, GOF)GOF设计模式主要分为结构型、行为型及创建型3类共计23种[4]。随着设计模式应用技术的普及化与成熟化,现有设计模式在实际应用被不断演化,并形成3类GOF标准设计模式变体[5-6]。文獻[7]基于形式概念分析FCA与实例推理技术CBR,并应用余弦理论提出一种设计模式方案推荐系统。文献[8]结合图形理论与矩阵相似计算理论提出一种设计模式检测策略。文献[9]对设计模式参与者角色间的关系进行了分类研究,侧重探讨了改变设计模式意图的附加关系,并依据特征制定了附加关系识别规则。文献[10]基于子图同构原理与UML类图匹配策略进行了设计模式实例挖掘。
为此,进行设计模式研究是非常有意义的,而设计模式演化后的变体更是研究的热点与难点,本文工作将对典型设计模式变体进行研究分析与实现。
2 GOF模式变体分类识别研究
为研究设计模式变体,以结构型装饰者模式与代理模式为例进行深入研究。
2.1 装饰者设计模式变体
GOF标准装饰者模式意图不是为某个类,而是为一个具体对象增加新的功能。图1为一个典型的装饰者模式变体。
——————一person接口———————
public interface Person { void eat();}
——————-二Man———————————
public class Man implements Person {
public void eat() {
System.out.println("男人在吃"); }}
——————-三Decorator抽象类——————
public abstract class Decorator implements Person {
protected Person person;
public void setPerson(Person person) {
this.person = person; }
public void eat() {person.eat();}}
——————四Decorator的扩展类—————
public class ManDecoratorA extends Decorator {
public void eat() {
super.eat();
reEat();
System.out.println("ManDecoratorA类");}
public void reEat() {
System.out.println("再吃一顿饭");}}
public class ManDecoratorB extends Decorator {
public void eat() {
super.eat();
System.out.println("吃菜");
System.out.println("ManDecoratorB类"); }}
————————-六Container————————
public class Container {
public ManDecoratorA ManDecoratorA(Person person){
ManDecoratorA A= new ManDecoratorA();
A.setPerson(person);
return A; }
public ManDecoratorB ManDecoratorB(Person person){
ManDecoratorB B= new ManDecoratorB();
B.setPerson(person);
return B;}}
————————七test类————————
public class test {
public static void main(String[] args) {
Man man = new Man();
Container c=new Container();
c.ManDecoratorB(c.ManDecoratorA(man)).eat();}}
2.2 代理设计模式变体
代理模式旨在为设计模式参与者角色对象提供一种可访问某种特定对象的代理控制机制。
——————————-项目接口—————————
public interface ISubject { void action(); }
——————————-抽象项目—————————-
public abstract class AbstractRealSubject implements ISubject{
public void action(){ }
———————-抽象项目的泛化3个———————-
public class RealSubject1 extends AbstractRealSubject {
public void action(){
System.out.println("代理开始");
System.out.println("这是第一个项目在执行");
System.out.println("代理结束"); }}
public class RealSubject2 extends AbstractRealSubject {
public void action(){
System.out.println("代理開始");
System.out.println("这是第二个项目在执行");
System.out.println("代理结束"); }}
public class RealSubject3 extends AbstractRealSubject {
public void action(){
System.out.println("代理开始");
System.out.println("这是第三个项目在执行");
System.out.println("代理结束"); }}
————————项目的代理————————-
package Proxy01;
public class SubjectProxy implements ISubject{
AbstractRealSubject subject;
public SubjectProxy(){
System.out.println("——这是代理类——");}
public void action() {subject=new RealSubject1();}
public void Subject1() {
subject=new RealSubject1();
subject.action();}
public void Subject2() {
subject=new RealSubject2();
subject.action();}
public void Subject3() {
subject=new RealSubject3();
subject.action();}
————————-test类————————-
public class test {
public static void main(String[] args) {
SubjectProxy proxy=new SubjectProxy();
proxy.Subject1();
proxy.Subject2();
proxy.Subject3();}}
3 结论
GOF设计模式在软件系统设计中得到广泛的应用,但传统23种经典GOF设计模式已不能完全满足设计模式需求,本文工作侧重研究设计模式演化后变体的实际应用,并对设计模式分类进行了实现,取得了较好的效果。事实证明设计模式变体的研究具有积极的意义,后续工作中将对设计模式变体进行更深入的研究,归纳具有普遍性的变体识别规则,并为设计模式变体检测奠定坚实的基础。
参考文献:
[1] 肖卓宇, 何锫, 余波, 等. 一种形式化上下无关文法关系驱动的设计模式检测方法[J]. 工程科学学报, 2016, 38(10).
[2] 肖卓宇, 何锫, 余波. 一种多阶段交互式线索驱动的设计模式识别方法[J]. 北京航空航天大学学报, 2017, 43(9).
[3] 肖卓宇, 何锫, 杨鑫维, 等. 基于文法产生式优化的设计模式识别方法[J]. 电子科技大学学报, 2017, 46(3).
[4] 肖卓宇, 黄海, 何锫, 等. 设计模式检测工具有效性评估策略[J/OL]. 计算机科学与探索, http://kns.cnki.net/kcms/detail/11.5602.TP.20170504.1312.006.html.
[5] 肖卓宇, 何锫, 陈俊旭,等. 设计模式变体检测研究[J]. 小型微型计算机系统, 2017, 38(8).
[6] 肖卓宇, 何锫, 陈俊旭. 设计模式变体的描述与验证[J]. 计算机应用研究, 2017, 34(6).
[7] 肖卓宇, 何锫, 余波, 等. 基于FCA与CBR的设计模式检测[J]. 山东大学学报:工学版, 2016, 46(2).
[8] 肖卓宇, 黎妍, 何锫, 等. 基于矩阵积分评估的设计模式检测研究[J]. 小型微型计算机系统, 2016, 37(7).
[9] 肖卓宇, 何锫, 黎妍. 基于设计模式角色的附加关系检测研究[J]. 计算机应用研究, 2015, 32(7).
[10] 肖卓宇, 何锫, 黎妍. 基于DPS表达式类图的设计模式检测[J]. 计算机工程与设计, 2015, 36(10).