李港 楊道武 彭逸凡 董澤民 肖卓宇
摘要:設(shè)計(jì)模式提供一種可復(fù)用的解決方案,并有助于提高軟件研發(fā)的效率。但隨著GOF設(shè)計(jì)模式成熟化與規(guī)?;F(xiàn)有23種經(jīng)典設(shè)計(jì)模式已不能滿足業(yè)務(wù)需求,為此,眾多學(xué)者對(duì)傳統(tǒng)GOF設(shè)計(jì)模式進(jìn)行了演化,該文致力于演化后設(shè)計(jì)模式的研究,提出了設(shè)計(jì)模式變體的概念,研究了變體特征,以裝飾者模式與代理模式為例,給出了具體的研究實(shí)現(xiàn),取得了較好的研究效果,說明了設(shè)計(jì)模式變體值得進(jìn)一步深入研究。
關(guān)鍵詞:設(shè)計(jì)模式;設(shè)計(jì)模式變體;方案演化;設(shè)計(jì)模式分類;GOF
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)31-0085-02
1 概述
設(shè)計(jì)模式是一套經(jīng)典的,并得到了廣大軟件開發(fā)人員認(rèn)可的可復(fù)用設(shè)計(jì)方案[1-3]。目前,(Gang of four, GOF)GOF設(shè)計(jì)模式主要分為結(jié)構(gòu)型、行為型及創(chuàng)建型3類共計(jì)23種[4]。隨著設(shè)計(jì)模式應(yīng)用技術(shù)的普及化與成熟化,現(xiàn)有設(shè)計(jì)模式在實(shí)際應(yīng)用被不斷演化,并形成3類GOF標(biāo)準(zhǔn)設(shè)計(jì)模式變體[5-6]。文獻(xiàn)[7]基于形式概念分析FCA與實(shí)例推理技術(shù)CBR,并應(yīng)用余弦理論提出一種設(shè)計(jì)模式方案推薦系統(tǒng)。文獻(xiàn)[8]結(jié)合圖形理論與矩陣相似計(jì)算理論提出一種設(shè)計(jì)模式檢測(cè)策略。文獻(xiàn)[9]對(duì)設(shè)計(jì)模式參與者角色間的關(guān)系進(jìn)行了分類研究,側(cè)重探討了改變?cè)O(shè)計(jì)模式意圖的附加關(guān)系,并依據(jù)特征制定了附加關(guān)系識(shí)別規(guī)則。文獻(xiàn)[10]基于子圖同構(gòu)原理與UML類圖匹配策略進(jìn)行了設(shè)計(jì)模式實(shí)例挖掘。
為此,進(jìn)行設(shè)計(jì)模式研究是非常有意義的,而設(shè)計(jì)模式演化后的變體更是研究的熱點(diǎn)與難點(diǎn),本文工作將對(duì)典型設(shè)計(jì)模式變體進(jìn)行研究分析與實(shí)現(xiàn)。
2 GOF模式變體分類識(shí)別研究
為研究設(shè)計(jì)模式變體,以結(jié)構(gòu)型裝飾者模式與代理模式為例進(jìn)行深入研究。
2.1 裝飾者設(shè)計(jì)模式變體
GOF標(biāo)準(zhǔn)裝飾者模式意圖不是為某個(gè)類,而是為一個(gè)具體對(duì)象增加新的功能。圖1為一個(gè)典型的裝飾者模式變體。
——————一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的擴(kuò)展類—————
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 代理設(shè)計(jì)模式變體
代理模式旨在為設(shè)計(jì)模式參與者角色對(duì)象提供一種可訪問某種特定對(duì)象的代理控制機(jī)制。
——————————-項(xiàng)目接口—————————
public interface ISubject { void action(); }
——————————-抽象項(xiàng)目—————————-
public abstract class AbstractRealSubject implements ISubject{
public void action(){ }
———————-抽象項(xiàng)目的泛化3個(gè)———————-
public class RealSubject1 extends AbstractRealSubject {
public void action(){
System.out.println("代理開始");
System.out.println("這是第一個(gè)項(xiàng)目在執(zhí)行");
System.out.println("代理結(jié)束"); }}
public class RealSubject2 extends AbstractRealSubject {
public void action(){
System.out.println("代理開始");
System.out.println("這是第二個(gè)項(xiàng)目在執(zhí)行");
System.out.println("代理結(jié)束"); }}
public class RealSubject3 extends AbstractRealSubject {
public void action(){
System.out.println("代理開始");
System.out.println("這是第三個(gè)項(xiàng)目在執(zhí)行");
System.out.println("代理結(jié)束"); }}
————————項(xiàng)目的代理————————-
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 結(jié)論
GOF設(shè)計(jì)模式在軟件系統(tǒng)設(shè)計(jì)中得到廣泛的應(yīng)用,但傳統(tǒng)23種經(jīng)典GOF設(shè)計(jì)模式已不能完全滿足設(shè)計(jì)模式需求,本文工作側(cè)重研究設(shè)計(jì)模式演化后變體的實(shí)際應(yīng)用,并對(duì)設(shè)計(jì)模式分類進(jìn)行了實(shí)現(xiàn),取得了較好的效果。事實(shí)證明設(shè)計(jì)模式變體的研究具有積極的意義,后續(xù)工作中將對(duì)設(shè)計(jì)模式變體進(jìn)行更深入的研究,歸納具有普遍性的變體識(shí)別規(guī)則,并為設(shè)計(jì)模式變體檢測(cè)奠定堅(jiān)實(shí)的基礎(chǔ)。
參考文獻(xiàn):
[1] 肖卓宇, 何锫, 余波, 等. 一種形式化上下無關(guān)文法關(guān)系驅(qū)動(dòng)的設(shè)計(jì)模式檢測(cè)方法[J]. 工程科學(xué)學(xué)報(bào), 2016, 38(10).
[2] 肖卓宇, 何锫, 余波. 一種多階段交互式線索驅(qū)動(dòng)的設(shè)計(jì)模式識(shí)別方法[J]. 北京航空航天大學(xué)學(xué)報(bào), 2017, 43(9).
[3] 肖卓宇, 何锫, 楊鑫維, 等. 基于文法產(chǎn)生式優(yōu)化的設(shè)計(jì)模式識(shí)別方法[J]. 電子科技大學(xué)學(xué)報(bào), 2017, 46(3).
[4] 肖卓宇, 黃海, 何锫, 等. 設(shè)計(jì)模式檢測(cè)工具有效性評(píng)估策略[J/OL]. 計(jì)算機(jī)科學(xué)與探索, http://kns.cnki.net/kcms/detail/11.5602.TP.20170504.1312.006.html.
[5] 肖卓宇, 何锫, 陳俊旭,等. 設(shè)計(jì)模式變體檢測(cè)研究[J]. 小型微型計(jì)算機(jī)系統(tǒng), 2017, 38(8).
[6] 肖卓宇, 何锫, 陳俊旭. 設(shè)計(jì)模式變體的描述與驗(yàn)證[J]. 計(jì)算機(jī)應(yīng)用研究, 2017, 34(6).
[7] 肖卓宇, 何锫, 余波, 等. 基于FCA與CBR的設(shè)計(jì)模式檢測(cè)[J]. 山東大學(xué)學(xué)報(bào):工學(xué)版, 2016, 46(2).
[8] 肖卓宇, 黎妍, 何锫, 等. 基于矩陣積分評(píng)估的設(shè)計(jì)模式檢測(cè)研究[J]. 小型微型計(jì)算機(jī)系統(tǒng), 2016, 37(7).
[9] 肖卓宇, 何锫, 黎妍. 基于設(shè)計(jì)模式角色的附加關(guān)系檢測(cè)研究[J]. 計(jì)算機(jī)應(yīng)用研究, 2015, 32(7).
[10] 肖卓宇, 何锫, 黎妍. 基于DPS表達(dá)式類圖的設(shè)計(jì)模式檢測(cè)[J]. 計(jì)算機(jī)工程與設(shè)計(jì), 2015, 36(10).