c#设计模式·结构型模式
看的过程中,发现好多模式都用过,只是没有总结,或者是不知道叫这个名字吧···
这里列举结构型模式,适配器、桥接、过滤、组合、装饰器、外观、享元、代理,
适配器模式:将现存的对象放到新的环境里边去,但是接口不一样,其实就是添加一个类把新的接口包装一样
之前公司的wcf服务端就是这种模式,公司很多部门,不同部门不同的业务都有自己相应的服务,之前是分开的,用的服务多的时候开服务很麻烦,现在想把他们统一起来,就可以用这种方式,wcf服务以接口定义契约,在实现类中写具体业务,可以定义一个统一的空接口,然所有的wcf接口都继承该空接口,然后统一后的类通过适配器构造相应的服务对象,然后加载,适配器里边可以通过统一的空接口反射获取对象,也可以直接通过不同服务的程序集名及类名获取对象,这样连统一接口都不用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ExercisePrj.Dsignmode
{
//统一接口
public interface IMediaPlayer
{
void Play(string audioType, string filename);
}
//播放接口
public interface IAdvanceMediaPlayer
{
void PlayVlc(string filename);
void PlayMp4(string filename);
}
public class VlcPlayer :IAdvanceMediaPlayer
{
public void PlayVlc(string filename)
{
Console.WriteLine("play vlc");
}
public void PlayMp4(string filename)
{ }
}
public class Mp4Player:IAdvanceMediaPlayer
{
public void PlayVlc(string filename)
{ }
public void PlayMp4(string filename)
{
Console.WriteLine("play mp4");
}
}
//适配器类
public class MediaAdapter : IMediaPlayer
{
IAdvanceMediaPlayer advancedMusicPlayer;
public MediaAdapter(String audioType)
{
if (audioType=="vlc")
{
advancedMusicPlayer = new VlcPlayer();
}
else if (audioType=="mp4")
{
advancedMusicPlayer = new Mp4Player();
}
} public void Play(String audioType, String fileName)
{
if (audioType=="vlc")
{
advancedMusicPlayer.PlayVlc(fileName);
}
else if (audioType=="mp4")
{
advancedMusicPlayer.PlayMp4(fileName);
}
}
}
//实体类
public class AutoPaly : IMediaPlayer
{
MediaAdapter mediaAdapter;
public void Play(String audioType, String fileName)
{
if (audioType == "mp3")
{
Console.WriteLine("play mp3");
}
else if (audioType == "vlc" || audioType == "mp4")
{
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.Play(audioType, fileName);
}
else
{
Console.WriteLine("invalid mediatype");
}
}
}
}
桥接模式:将抽象部分和实现部分分离,使他们可以独立变化,就是吧具体操作再抽象成接口,然后实现该接口,通过关联关系吧操作和实体结合,构造实体的时候根据情况构造对应的操作的实现类,传给实体
这玩意对抽象的设计要求有点高,一不小心就得跪
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ExercisePrj.Dsignmode
{
//桥接接口
public interface IDrawAPI
{
void DrawCircle(int radius, int x, int y);
}
//具体实现
public class GreenCircle:IDrawAPI
{
public void DrawCircle(int radius,int x,int y)
{
Console.WriteLine("draw green circle");
}
}
public class RedCircle : IDrawAPI
{
public void DrawCircle(int radius, int x, int y)
{
Console.WriteLine("draw red circle,x{0},y{1}",x,y);
}
}
//实体抽象基类
public abstract class ShapeEx
{
protected IDrawAPI drawAPI;
protected ShapeEx(IDrawAPI drawAPI)
{
this.drawAPI = drawAPI;
}
public abstract void Draw();
}
//继承实体实现类
public class CircleEx : ShapeEx
{
public int x { get; set; }
public int y { get; set; }
public int radius { get; set; }
private string color;
//演示实现享元模式的构造函数
public CircleEx(string color):base(null)
{
this.color = color;
drawAPI = new RedCircle();
}
public CircleEx(int x, int y, int radius,IDrawAPI drawapi ):base(drawapi)
{
this.x = x;
this.y = y;
this.radius = radius;
} public override void Draw()
{
drawAPI.DrawCircle(radius, x, y);
}
} }
过滤器模式:允许开发人员使用不同的标准过滤一组对象,通过逻辑运算以解耦的方式把他们连接起来,讲道理没看懂这模式有啥卵用,就是整了个过滤接口·然后用不同的实现继承该接口提一堆对象出来···这提了干啥··
这例子里边的直接用C#的linq扩展方法简单几句话就可以实现额。。。搞不懂··
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ExercisePrj.Dsignmode
{
//实体
public class Person
{
public string Name { get; }
public string Gender { get; }
public string MaritalStatus { get; }
public Person(string name,string gender,string maritalstatus)
{
Name = name;
Gender = gender;
MaritalStatus = maritalstatus;
}
}
//过滤标准接口
public interface ICriteria
{
List<Person> MeetCriteria(List<Person> persons);
}
//不同标准实现
public class CriteriaMale:ICriteria
{
public List<Person> MeetCriteria(List<Person> persons)
{
List<Person> maleCriterial = new List<Person>();
foreach(var p in persons)
{
if(p.Gender=="male")
{
maleCriterial.Add(p);
}
}
return maleCriterial;
}
}
public class CriteriaFemale : ICriteria
{
public List<Person> MeetCriteria(List<Person> persons)
{
List<Person> femaleCriterial = new List<Person>();
foreach (var p in persons)
{
if (p.Gender == "female")
{
femaleCriterial.Add(p);
}
}
return femaleCriterial;
}
}
public class CriteriaSingle : ICriteria
{
public List<Person> MeetCriteria(List<Person> persons)
{
List<Person> Criterialsingle = new List<Person>();
foreach (var p in persons)
{
if (p.MaritalStatus == "Single")
{
Criterialsingle.Add(p);
}
}
return Criterialsingle;
}
}
public class AndCriteria : ICriteria
{
private ICriteria criteria;
private ICriteria otherCriteria; public AndCriteria(ICriteria criteria, ICriteria otherCriteria)
{
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
public List<Person> MeetCriteria(List<Person> persons)
{
List<Person> firstCriteriaPersons = criteria.MeetCriteria(persons);
return otherCriteria.MeetCriteria(firstCriteriaPersons);
}
} public class OrCriteria :ICriteria
{
private ICriteria criteria;
private ICriteria otherCriteria; public OrCriteria(ICriteria criteria, ICriteria otherCriteria)
{
this.criteria = criteria;
this.otherCriteria = otherCriteria;
} public List<Person> MeetCriteria(List<Person> persons)
{
List<Person> firstCriteriaItems = criteria.MeetCriteria(persons);
List<Person> otherCriteriaItems = otherCriteria.MeetCriteria(persons);
foreach (Person p in otherCriteriaItems)
{
if (!firstCriteriaItems.Contains(p))
{
firstCriteriaItems.Add(p);
}
}
return firstCriteriaItems;
}
}
}
组合模式:又叫部分整体模式,有些实体存在可能的树形结构,就用这种模式,这个其实用的比较多,比如用仪器测数据,有些仪器一次就一个仪器就可以了,有些仪器可能需要几个仪器组合起来才能测,还有公司里的雇员结构也是这样的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ExercisePrj.Dsignmode
{
public class Employee
{
private String name;
private String dept;
private int salary;
private List<Employee> subordinates;
public Employee(String name, String dept, int sal)
{
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new List<Employee>();
} public void add(Employee e)
{
subordinates.Add(e);
} public void remove(Employee e)
{
subordinates.Remove(e);
} public List<Employee> getSubordinates()
{
return subordinates;
} public override string ToString()
{
return ("Employee :[ Name : " + name+ ", dept : " + dept + ", salary :" + salary + " ]");
}
}
}
装饰器模式,向现有的对象添加新的功能,不改变原有结构,这玩意就是C#的扩展方法的应用场景额。。。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ExercisePrj.Dsignmode
{
//装饰抽象类
public abstract class ShapeDecorator : IShape
{
protected IShape decoratedShape; public ShapeDecorator(IShape decoratedShape)
{
this.decoratedShape = decoratedShape;
} public virtual void Draw()
{
decoratedShape.Draw();
}
}
//装饰实现类
public class RedShapeDecorator : ShapeDecorator
{ public RedShapeDecorator(IShape decoratedShape):base(decoratedShape)
{ }
public override void Draw()
{
decoratedShape.Draw();
setRedBorder(decoratedShape);
} private void setRedBorder(IShape decoratedShape)
{
Console.WriteLine("Border Color: Red");
}
}
//用扩展方法的方式直接实现
public static class ShapeExpend
{
public static void SetColor(this IShape shape)
{
Console.WriteLine("border Color: Red");
}
} }
外观模式:就是用个类把一些复杂的功能包装一下··很多地方都有这个的体现··mvc传统的三层架构都是这玩意的体现···
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ExercisePrj.Dsignmode
{
//外观类
public class ShapeMaker
{
private IShape circle;
private IShape line; public ShapeMaker()
{
circle = new Circle();
line = new Line();
} public void drawCircle()
{
circle.Draw();
}
public void drawLine()
{
line.Draw();
}
}
}
享元模式:用于减少创建对象,减少内存和提高性能,就是缓存用过的对象,下次要用就在里边找,没有就新建添加··,没用过···,可能是没做过大型的项目···
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ExercisePrj.Dsignmode
{
//享元模式的工厂类
public class ShapeFlyweight
{
private static readonly Dictionary<string, ShapeEx> circleMap = new Dictionary<string, ShapeEx>(); public static ShapeEx getCircle(string color)
{
CircleEx circle; if (!circleMap.Keys.Contains(color))
{
circle = new CircleEx(color);
circleMap.Add(color, circle);
Console.WriteLine("Creating circle of color : " + color);
return circle;
}
else
{
circle=(CircleEx)circleMap[color];
}
return circle;
}
}
}
代理模式:相当于在类外边加壳,各种代理都是该模式的体现···主要是为了控制外界对类的操作吧。
博客园这个添加代码窗体里边的那个提交按钮没有做多次点击处理···点快点可以提交几次·····
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ExercisePrj.Dsignmode
{
public interface IImage
{
void Display();
}
public class RealImage:IImage
{
private string filename;
public RealImage(string filename)
{
this.filename = filename;
loadfile(filename);
}
public void Display()
{
Console.WriteLine("display:"+filename);
}
private void loadfile(string filename)
{
Console.WriteLine("loadfile");
}
}
//代理类
public class ProxyImage : IImage
{ private RealImage realImage;
private String fileName; public ProxyImage(String fileName)
{
this.fileName = fileName;
} public void Display()
{
if (realImage == null)
{
realImage = new RealImage(fileName);
}
realImage.Display();
}
}
}
c#设计模式·结构型模式的更多相关文章
- 设计模式-结构型模式,python组合模式
设计模式上大的方向上分继承和组合,就是类模式和对象模式.此篇的组合模式非继承和组合概念中的组合.桥接 策略 代理 装饰者都用了组合,此组合非彼组合. 组合模式 组合模式(Composite Patte ...
- 设计模式-结构型模式,python桥接模式
桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉及到一个作为桥接 ...
- Java设计模式——结构型模式
Java设计模式中共有7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,其关系如下面的图:1.适配器模式 适配器模式将某个类 ...
- 设计模式 结构型模式 外观模式(Facade Pattern)
在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“ ...
- java设计模式结构型模式
结构型模式: – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结 构,用来解决更大的问题 分类: • 适配器模式.代理模式.桥接模式. 装饰模式.组合模式.外观模式.享元模式 结构型模式 ...
- java设计模式--结构型模式--桥接模式
桥接模式 概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或 ...
- java设计模式--结构型模式--外观模式
外观模式 概述 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 1.当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不 ...
- java设计模式--结构型模式--装饰模式
装饰模式 概述 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 适用性 1.在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 2.处理 ...
- java设计模式--结构型模式--享元模式
享元模式 概述 运用共享技术有效地支持大量细粒度的对象. 适用性 当都具备下列情况时,使用Flyweight模式: 1.一个应用程序使用了大量的对象. 2.完全由于使用大量的对象,造成很大的存储开销. ...
随机推荐
- hdoj1175 连连看(dfs+剪枝)
处理连连看问题. 要求拐弯方向不多于两次.剪枝很重要!!! 用dir记录当前方向.Orz,居然没想到. #include<iostream> #include<cstring> ...
- 使用python进行短信轰炸
本文作者:i春秋作家——Hacker1ee 大家好,我是1ee(因为在作家群,就不加Hacker这个前缀了,怕被大佬打..) 刚加入i春秋作家组希望大家多多关照,也欢迎大家找我交流 今天我来讲讲我最近 ...
- 内核漏洞学习—熟悉HEVD
一直以来内核漏洞安全给很多人的印象就是:难,枯燥.但是内核安全是否掌握是衡量一个系统安全工程师水平的标准之一,也是安全从业人员都应该掌握的基本功.本文通过详细的实例带领读者走进内核安全的大门.难度系数 ...
- linux下tomcat运行war包常用命令
一.先是war包copy到 linux 的相关目录,我这的是/opt/soft/tomcat_ecp/webapps. 如果是老项目,在导入war的之前,习惯上是把之前的war备份一下, 如 mv p ...
- git修改文件权限方式
查看Repository中文件权限 git ls-tree HEAD 100644 blob 018321abfbff52d175a788597f5b5f3f17f67dc7 .gitignore 1 ...
- easyui页面上字段排序并与后台交互
在开始对easyui里面页面上进行排序,感觉应该不怎么难,但是在操作的时候并没有那么简单,上网也查了很多进行排序的方法,最终总结出这个方法,供大家参考使用: 一.在easyui里面上只需 1.将要进行 ...
- iOS----线程之间的通信
当线程的数量大于一个的时候,线程之间可能会产生通信,既一个线程产生的结果要被另一个线程用到. 比如常用的图片的加载就是这个样子.图片的加载是在子线程进行的,当图片加载完毕,就会回到主线程中刷新UI,展 ...
- numpy的ravel()和flatten()函数比较
功能 两个函数的功能都是将多维数组降为一维. 用法 import numpy as np arr = np.array([[1, 2],[3, 4]]) arr.flatten() arr.ravel ...
- 【bzoj3684】 大朋友和多叉树 生成函数+多项式快速幂+拉格朗日反演
这题一看就觉得是生成函数的题... 我们不妨去推下此题的生成函数,设生成函数为$F(x)$,则$[x^s]F(x)$即为答案. 根据题意,我们得到 $F(x)=x+\sum_{i∈D} F^i(x)$ ...
- 利用Windows资源监视器解决文件夹无法改名无法删除问题
在win7等Windows系统操作文件夹更名.删除时经常会报错,操作无法完成,balabala 这个时候仅凭在用的软件去一个一个找是很难的,即便软件全关了,还有后台进程,,,奔溃吧 好了,现在我们有了 ...