《C#面向对象的23种设计模式介绍》是一篇系统性的介绍C#中常见23种设计模式的文章。下面我将为大家详细讲解这篇文章的完整攻略:
一、前言
文章先介绍了设计模式的概念和作用,以及在软件开发中为什么需要设计模式。同时也会提醒读者,设计模式仅仅是一种思想上的借鉴,不能盲目使用。
二、设计模式的分类
文章接着介绍了设计模式的分类方式,分为三类:创建型模式、结构型模式和行为型模式。分别列举了各类设计模式的特点和使用场景。
三、设计模式的具体介绍
在这一部分,会详细介绍每一种设计模式的定义、实现、优缺点以及代码示例等内容。
1. 创建型模式
工厂方法模式
工厂方法模式(Factory Method Pattern)定义了一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。
在此模式下,具体的工厂由抽象工厂类的派生类实现,在工厂类中调用抽象产品类中定义的方法,返回抽象产品类的实例。
例如,我们需要创建一个接口为IFruit
的对象,并且具体实现类为Apple
,则可以使用如下代码:
public class Program
{
static void Main(string[] args)
{
// 创建手机工厂对象
IFruitFactory fruitFactory = new AppleFactory();
// 生产手机
IFruit fruit = fruitFactory.Create();
// 显示手机信息
fruit.Show();
}
}
public interface IFruit
{
void Show();
}
public class Apple : IFruit
{
public void Show()
{
Console.WriteLine("This is an apple.");
}
}
public interface IFruitFactory
{
IFruit Create();
}
public class AppleFactory : IFruitFactory
{
public IFruit Create()
{
return new Apple();
}
}
抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
在此模式下,抽象工厂类定义了一系列方法,具体工厂类实现这些方法,并返回一系列相关对象。
例如,我们需要创建一个手机产品,在此基础上又要有不同的版本(例如屏幕大小、像素等参数)。则可以使用如下代码:
public class Program
{
static void Main(string[] args)
{
// 创建三星工厂对象
IPhoneFactory samsungFactory = new SamsungFactory();
// 生产 GalaxyS10
IPhone samsungPhone = samsungFactory.CreatePhone();
// GalaxyS10 显示信息
samsungPhone.Show();
// 生产 GalaxyS10Display
IDisplay samsungDisplay = samsungFactory.CreateDisplay();
// GalaxyS10Display 显示信息
samsungDisplay.Show();
// 创建苹果工厂对象
IPhoneFactory appleFactory = new AppleFactory();
// 生产 iPhoneX
IPhone applePhone = appleFactory.CreatePhone();
// iPhoneX 显示信息
applePhone.Show();
// 生产 iPhoneXDisplay
IDisplay appleDisplay = appleFactory.CreateDisplay();
// iPhoneXDisplay 显示信息
appleDisplay.Show();
}
}
public interface IPhone
{
void Show();
}
public class SamsungPhone : IPhone
{
public void Show()
{
Console.WriteLine("This is a Samsung phone.");
}
}
public class ApplePhone : IPhone
{
public void Show()
{
Console.WriteLine("This is an Apple phone.");
}
}
public interface IDisplay
{
void Show();
}
public class SamsungDisplay : IDisplay
{
public void Show()
{
Console.WriteLine("This is a Samsung display.");
}
}
public class AppleDisplay : IDisplay
{
public void Show()
{
Console.WriteLine("This is an Apple display.");
}
}
public interface IPhoneFactory
{
IPhone CreatePhone();
IDisplay CreateDisplay();
}
public class SamsungFactory : IPhoneFactory
{
public IPhone CreatePhone()
{
return new SamsungPhone();
}
public IDisplay CreateDisplay()
{
return new SamsungDisplay();
}
}
public class AppleFactory : IPhoneFactory
{
public IPhone CreatePhone()
{
return new ApplePhone();
}
public IDisplay CreateDisplay()
{
return new AppleDisplay();
}
}
2. 结构型模式
适配器模式
适配器模式(Adapter Pattern)将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
例如,我们有一个使用220V电压的电视,但我们只有110V的电源,此时就需要将电源适配器中的110V电压转换为220V电压。则可以使用如下代码:
public class Program
{
static void Main(string[] args)
{
// 使用电源适配器
PowerAdapter adapter = new PowerAdapter();
adapter.ChangeVoltage();
}
}
public interface IPower
{
void Use220V();
}
public class TV : IPower
{
public void Use220V()
{
Console.WriteLine("使用220V电压");
}
}
public class PowerAdapter
{
private readonly IPower power;
public PowerAdapter()
{
this.power = new TV();
}
public void ChangeVoltage()
{
Console.WriteLine("使用电源适配器");
this.power.Use220V();
}
}
3. 行为型模式
责任链模式
责任链模式(Chain of Responsibility Pattern)为解除请求的发送者和接收者之间的耦合,而将请求的处理者链式排列,将请求沿着这条链传递,直到有一个处理者能够处理它为止。
例如,我们在一个网站上购买商品时,会出现多种付款方式,如支付宝、微信、银联等,如果某个付款方式被拒绝,则会依次切换到下一个付款方式,直到订单被支付为止。则可以使用如下代码:
public class Program
{
static void Main(string[] args)
{
// 创建支付方式
PaymentHandler aliPayHandler = new AliPayHandler();
PaymentHandler wechatPayHandler = new WechatPayHandler();
PaymentHandler unionPayHandler = new UnionPayHandler();
// 设置支付方式之间的顺序
aliPayHandler.SetNextHandler(wechatPayHandler);
wechatPayHandler.SetNextHandler(unionPayHandler);
// 客户端输入购买商品的总金额和支付方式,通过支付方式进行支付
Console.WriteLine("请输入购买商品的总金额:");
decimal total = decimal.Parse(Console.ReadLine());
Console.WriteLine("请选择支付方式:1.支付宝 2.微信支付 3.银联支付");
int payType = int.Parse(Console.ReadLine());
Payment request = new Payment { Total = total, PayType = (PayTypeEnum)payType };
aliPayHandler.HandleRequest(request);
}
}
public enum PayTypeEnum
{
AliPay = 1,
WechatPay = 2,
UnionPay = 3
}
public class Payment
{
public decimal Total { get; set; }
public PayTypeEnum PayType { get; set; }
}
public abstract class PaymentHandler
{
protected PaymentHandler nextHandler;
public void SetNextHandler(PaymentHandler nextHandler)
{
this.nextHandler = nextHandler;
}
public abstract void HandleRequest(Payment request);
}
public class AliPayHandler : PaymentHandler
{
public override void HandleRequest(Payment request)
{
if (request.PayType == PayTypeEnum.AliPay)
{
Console.WriteLine("使用支付宝支付了{0}元", request.Total);
}
else
{
if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
}
}
}
public class WechatPayHandler : PaymentHandler
{
public override void HandleRequest(Payment request)
{
if (request.PayType == PayTypeEnum.WechatPay)
{
Console.WriteLine("使用微信支付支付了{0}元", request.Total);
}
else
{
if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
}
}
}
public class UnionPayHandler : PaymentHandler
{
public override void HandleRequest(Payment request)
{
if (request.PayType == PayTypeEnum.UnionPay)
{
Console.WriteLine("使用银联支付支付了{0}元", request.Total);
}
else
{
if (nextHandler != null)
{
nextHandler.HandleRequest(request);
}
}
}
}
四、结论
文章最后总结了C#中常见的23种设计模式,还提醒读者在实际应用中需要根据具体情况灵活使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#面向对象的23种设计模式介绍 - Python技术站