不久前的面试过程中,面试官问了一些设计模式的概念。由于本人是数学专业出身,虽然毕业后自学过一些软件工程的知识,但是由于一直没有派上用场,于是忘得差不多了,下面来巩固一下设计模式的基础知识。
设计模式是在软件工程中用于解决常见设计问题的可复用解决方案。它们提供了一种经过验证的方法来解决特定类型的问题,并鼓励代码重用、增强代码可读性和可维护性。
常见的设计模式包括但不限于以下几种:
1. **创建型模式**:用于对象的创建机制,包括工厂模式、抽象工厂模式、建造者模式、单例模式等。
2. **结构型模式**:用于处理类和对象的组合,包括适配器模式、装饰器模式、代理模式、组合模式等。
3. **行为型模式**:用于对象之间的通信和职责分配,包括观察者模式、策略模式、模板方法模式、命令模式等。
每种设计模式都有其独特的应用场景和解决问题的方式。使用设计模式可以提高代码的灵活性、可扩展性和可维护性,因为它们提供了经过验证的最佳实践方法。
设计模式并非适用于所有情况,因此在应用设计模式时,需要根据具体的情况和需求进行权衡和选择。深入理解不同设计模式的工作原理和应用场景将有助于开发更高质量、可维护和可扩展的软件系统。
老规矩,所有光讲概念,不讲代码的文章都是耍流氓,下面展示一段由C#编写的桥接模式的示例(ps:桥接模式属于结构型模式的一种,强调类和对象的组合)
using System;
// 实现部分接口
public interface IDrawingAPI
{
void DrawCircle(int x, int y, int radius);
}
// 具体的实现部分
public class DrawingAPI1 : IDrawingAPI
{
public void DrawCircle(int x, int y, int radius)
{
Console.WriteLine($"使用API1在{x},{y}处以半径{radius}绘制圆形");
}
}
public class DrawingAPI2 : IDrawingAPI
{
public void DrawCircle(int x, int y, int radius)
{
Console.WriteLine($"使用API2在{x},{y}处以半径{radius}绘制圆形");
}
}
// 抽象部分
public abstract class Shape
{
protected IDrawingAPI drawingAPI;
protected Shape(IDrawingAPI drawingAPI)
{
this.drawingAPI = drawingAPI;
}
public abstract void Draw();
}
// 具体的抽象部分
public class CircleShape : Shape
{
private int x, y, radius;
public CircleShape(int x, int y, int radius, IDrawingAPI drawingAPI) : base(drawingAPI)
{
this.x = x;
this.y = y;
this.radius = radius;
}
public override void Draw()
{
drawingAPI.DrawCircle(x, y, radius);
}
}
// 使用示例
class Program
{
static void Main(string[] args)
{
// 使用 API1 来绘制圆形
IDrawingAPI api1 = new DrawingAPI1();
CircleShape circle1 = new CircleShape(1, 2, 3, api1);
circle1.Draw();
// 使用 API2 来绘制圆形
IDrawingAPI api2 = new DrawingAPI2();
CircleShape circle2 = new CircleShape(5, 7, 11, api2);
circle2.Draw();
Console.ReadKey();
}
}
通过代码,我们可以看见,桥接模式的关键点在于子类具有父类的属性,子类 CircleShape
中拥有父类 Shape
的属性 drawingAPI
。在 CircleShape
类的构造函数中,使用 base(drawingAPI)
来调用父类 Shape
的构造函数,从而为父类的 drawingAPI
属性赋值。这意味着 CircleShape
对象中有一个指向实现部分的接口 IDrawingAPI
的引用。