• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

1.目的

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

2.结构

qd4djkakeyt4480.png

3.参与者

门面:知道哪些子系统负责处理请求;将客户的请求委托给适当的子系统对象。

子系统类:实现子系统的功能;处理门面对象分配的任务;没有关于facade的信息,也就是没有指向facade的指针;

4.适应性

在下列情况下使用外观模式:

当您希望为复杂的子系统提供简单的接口时。子系统往往因为不断进化而变得越来越复杂。大多数模式在使用时会产生更多更小的类。这使得子系统的可重用性更强,更容易定制,但也给不需要定制子系统的用户带来了一些困难。Facade可以提供一个简单的默认视图,这对于大多数用户来说已经足够了,而那些需要更多可定制性的用户可以绕过Facade层。

客户端程序和抽象类的实现部分有很大的依赖性。Facade将这个子系统从客户和其他子系统中分离出来,可以提高子系统的独立性和可移植性。

5.代码示例

/Scanner类接收字符流并生成标识符流,一次一个标记。

类别扫描器

{

公共:

扫描仪(istream);

虚拟~ Scanner();

虚拟令牌扫描();

private:

istream _ inputstream

};

//Parser类,该类使用Scanner和ProgramNodeBuilder生成的标识符来构建解析树。

类别分析器

{

公共:

parser();

虚拟~解析器();

虚拟void Parse(Scanner,ProgramNodeBuilder);

};

//Parser回调ProgramNodeBuilder逐步构建解析树,这些类按照Builder模式交互。

类ProgramNodeBuilder

{

公共:

ProgramNodeBuilder();

虚拟program node * new variable(const char * variableName)const;

虚拟ProgramNode* new assignment(program node *变量,program node *表达式)const

虚拟program node * new return statement(program node * value)const;

虚拟program node * new condition(program node * condition,ProgramNode* truePart

program node * false part)const;

//.

program node * GetRootNode();

private:

ProgramNode * _ node

};

//解析树由ProgramNode的子类实例组成(如StatementNode、ExpressionNode等。).

//ProgramNode hierarchy是复合模式的一个应用例子。ProgramNode定义了一个

//接口用于操作程序节点及其子节点(如果有)。

类程序节点

{

公共:

//程序节点操作

虚拟void getsourcesposition(int line,int index);

//子操作

虚拟void Add(program node *);

虚拟void Remove(program node *);

//.

虚拟空遍历(代码生成器);

受保护的:

program node();

};

//遍历操作以CodeGenerator对象作为参数,ProgramNode的子类使用该对象生成机器码,

//机器码的格式是字节码流中的字节码对象。其中CodeGenerator类是Visitor(访问者)。

类别代码生成器

{

公共:

虚拟void访问(statement node *);

虚拟void访问(expression node *);

//.

受保护的:

CodeGenerator(字节流);

受保护的:

字节码流_输出;

};

//实现Traverse时,ProgramNode的每个子类都在它的Program Node的子对象上调用Traverse。

//每个子类依次对其子节点做同样的动作,这样就一直递归。比如ExpressionNode这样定义Traverse:

void表达式编号:Traverse(代码生成器cg)

{

cg.visit(这个);

ListIteratorProgramNode * I(_ children);

for(I . First();I . IsDone();一.下一个())

{

I . current item()-Traverse(CG);

}

}

//引入编译器类,这是一个将所有组件集成在一起的门面。编译器提供一个简单的接口。

//用于编译源代码,生成特定机器的可执行代码。

类编译器

{

公共:

编译器();

虚拟void编译器(istream,字节码流);

};

void编译器:编译(istream输入,字节码流输出)

{

扫描仪扫描仪(输入);

ProgramNodeBuilder生成器;

解析器parser;

解析器。解析(扫描仪、构建器);

RISCCodeGenerator发生器(输出);

ProgramNode* parseTree=builder。GetRootNode();

解析树遍历(生成器);

}

6.摘要

外观模式为用户提供了一个高层接口,屏蔽了多个子系统复杂的处理逻辑。用户只需要使用外观类提供的高层接口就可以实现自己的需求,而不必亲自与各个子系统打交道。

外观模式实现了子系统和客户之间的松耦合关系,子系统的功能变化不会影响客户。

当客户需要自定义自己的行为时,他们需要绕过Facade层,直接访问子系统。对于不需要定制子系统的用户,可以直接使用facade提供的高层接口来实现自己的需求。

Link to comment
Share on other sites