三十二.设计模式总结-结构型模式
设计模式总结
二.结构型模式
1,适配器模式
将一个第三方类方法,转换到另一个类中的调用的方法。
优点:使原本接口不兼容而不能工作的类一起工作,复用方法
缺点:改动源类会带来麻烦
总结:多用于后期维护,修改时,复用类似类,方法或控件时使用。
Class Translator//适配器
{
private F f=new F();
Pulic override void Add() {f.加();}
}
2,桥接模式
将抽象部分与它的实现部分分离,使他们都可以独立地变化
优点:可以对不同抽象接口和实现部分进行组合,并分别扩充。
对抽象的实现部分的修改对客户端不产生影响
总结:复杂了桥接提取部分,可以随意组合。对客户端不影响。
多用于在客户端调用实现部分有不同组合时使用。
class Abstraction//提取
{
protected Implementor implementor;
public void SetImplementor(Implementor implementor)
{this.implementor = implementor; }
public virtual void Operation(){implementor.Operation();}
}
3,组合模式
组合成树形结构表示对象的部分-整体层次结构。
优点:是用户对单个对象和组合对象的使用一致,忽略单个和整体区别
缺点:使用时必须符合部分-整体的情况。分清叶和节点的区别。
总结:组合模式将复杂逻辑放置于内部,减少客户端使用压力。
特点较明显,树形结构,组合明显的系统中使用。
使用时比较叶和节点,很好理解。
class Leaf:Component//在组合中表示叶节点对象,叶节点没有子节点
{
public Leaf(string name) : base(name) { }
public override void Add(Component c) {Console.WriteLine("Cannotadd to a leaf");}
public override void Remove(Component c) { ("Cannot remove from aleaf");}
public override void Display(int depth)
{Console.WriteLine(new string('-',depth)+name); }
}
class Composite:Component//定义有枝节点行为,用来存储子部件
{
private List<Component> children = new List<Component>();
public Composite(string name) : base(name) { }
public override void Add(Component c) {children.Add(c); }
public override void Remove(Component c) {children.Remove(c); }
public override void Display(int depth)
{
Console.WriteLine(new string('-',depth) + name);
foreach (Component co in children) {co.Display(depth+2); }
}
}
4,装饰模式
为已有功能动态的添加更多功能。
优点:动态添加功能。实例化的所有继承与装饰类,都可以相互添加功能。
总结:首先所有的实现类都是继承于同一个装饰类。
这些实现类的实现方法需要相互添加。满足这两条件时使用。
abstract class Decorator:Component//装饰类
{
protected Component component;
public void SetComponent(Componentcomponent) {this.component = component; }
public override voidOperation(){if (component != null) {component.Operation();}}
}
5,外观模式
封装子系统所提供的一组接口,方便程序调用。
优点:封装一些列复杂的接口方法调用,使用时更简洁,不必关心更多
缺点:封装一组复杂接口时,被封死,不易改动,不了解内部机制
总结:外观模式高内聚,低耦合。但封装内部一组接口时,不易改动。内部方法逻
辑稳定时使用
class Home//外观模式
{
Key key; Door door;
public Home(){key = new Key();door = new Door();}
public void InHome(){key.InKey();door.OpenDoor();}
public void OutHome(){door.CloseDoor();key.OutKey();}
}
6,享元模式
运用共享技术有效地支持大量细粒度的对象
优点:减少大量对象的使用,将对象的大多数状态放到外部
缺点:除去外部状态,对象要稳定一直,因为是共享的
总结:在大量使用类似对象时使用。比如围棋中的棋子,可以将坐标状态放到外部。
UsingSystem.Collections;
classWebSiteFactory//网站工厂
{
private Hashtable flyweights = new Hashtable();
public WebSite GetWebSiteCategory(stringkey) //获得网站分类
{
if (!flyweights.ContainsKey(key))
{flyweights.Add(key,new ConcreteWebSite(key)); }
return ((WebSite)flyweights[key]);
}
public int GetWebSiteCount()//获取网站总数{return flyweights.Count; }
}
7,代理模式
隐藏真实模块。为其他对象提供一种代理以控制对这个对象的访问
优点:隐藏真实模块
总结:类似于适配器,不过只是类名不同,方法名相同
class Proxy : Subject//代理类
{
RealSubject realsubject;
public override void Request()
{
if (realsubject == null) {realsubject = new RealSubject();}
realsubject.Request();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述