总结
> 这里简单总结一下前面提到的几种设计模式:
> – 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
> – 工厂模式(Factory):定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
> – 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
> – 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
> – 原型模式(Prototype):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
> – 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
> – 桥接模式(Bridge):将抽象部分与实现部分分离,使它们都可以独立地变化。
> – 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
> – 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式比生成子类更为灵活。
> – 外观模式(Facade):为子系统中的一组接口提供一个一致的界面。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
> – 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
> – 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
> – 责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
> – 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
> – 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
> – 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
> – 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
> – 备忘录模式(Memento):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
– 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
– 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。
– 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
– 模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
– 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
模式语言&设计模式
模式语言
设计模式的描述通常使用特定的模式语言。 以下是一些常用的模式语言:
类图(Class Diagram):用于描述系统中的类、接口、实例等元素之间的关系。
用例图(Use Case Diagram):用于描述系统的功能需求和用户与系统的交互。
时序图(Sequence Diagram):用于描述对象之间的交互顺序,以及消息的发送和接收时间。
状态图(Statechart Diagram):用于描述对象的状态变化以及状态之间的转换。
活动图(Activity Diagram):用于描述业务流程中的各个活动以及它们之间的依赖关系。
组件图(Component Diagram):用于描述系统中的组件以及它们之间的依赖关系。
部署图(Deployment Diagram):用于描述系统的物理部署结构,包括服务器、网络设备等。
设计模式
故事背景:在一个遥远的魔法世界里,有一个叫做“前端村”的小村庄。这个村庄里的居民都是各种各样的小动物,他们每天都要为村民们提供各种服务。其中,有一个叫做“小鹿”的小动物,他负责为村里的其他小动物编写代码,让他们能够更好地生活。
有一天,小鹿发现村里的很多小动物都在抱怨他们的代码总是出问题,而且修改起来非常麻烦。于是,小鹿决定向村里的长老请教如何解决这个问题。
长老告诉小鹿:“在我们的魔法世界里,有一种叫做‘设计模式’的东西,它可以帮助我们更好地组织和优化代码。你可以通过学习设计模式,让你的代码更加健壮和易于维护。”
小鹿听后非常感兴趣,于是开始了他的设计模式之旅。
首先,小鹿学习了什么是设计模式。设计模式是一种在特定环境下解决特定问题的经过验证的优秀解决方案。它们分为三大类:创建型模式、结构型模式和行为型模式。
接下来,小鹿学习了设计模式的发展背景。设计模式最早出现在20世纪80年代,当时的软件开发人员发现,很多软件系统存在很多重复的问题,而这些问题往往可以用一些通用的方法来解决。于是,他们将这些方法总结成了设计模式。
然后,小鹿学习了浏览器中的单例和发布订阅这两个主要设计模式。
- 单例模式:这是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。在前端开发中,我们可以使用jQuery的$.ajax()方法来实现单例模式。示例代码如下:
// 创建一个全局的ajax对象
var $ajax = window.$.ajax;
// 重写ajax方法,使其返回同一个实例
window.$.ajax = function(options) {
if (!this.instance) {
this.instance = new $ajax(options);
}
return this.instance;
};
- 发布订阅模式:这是一种行为型模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。在前端开发中,我们可以使用EventEmitter类来实现发布订阅模式。示例代码如下:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', (data) => {
console.log(`收到事件:${data}`);
});
myEmitter.emit('event', 'Hello World'); // 输出:收到事件:Hello World
最后,小鹿将所学的知识总结如下:
设计模式是解决特定问题的优秀解决方案,它们分为创建型模式、结构型模式和行为型模式。在前端开发中,我们可以使用jQuery的$.ajax()方法实现单例模式,使用EventEmitter类实现发布订阅模式。通过学习和运用设计模式,我们可以让我们的前端代码更加健壮、易于维护。
设计模式分类
设计模式可以分为三种类型:创建型模式、结构型模式和行为型模式。其中,创建型模式用于描述如何生成对象,结构型模式用于描述如何组合对象,行为型模式用于描述对象之间的交互。
以下是常见的23种设计模式:
- 创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
- 结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式:模板方法模式、策略模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
浏览器中的设计模式
一、创建型模式
- 单例模式(Singleton)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
- 建造者模式(Builder)
- 原型模式(Prototype)
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰器模式(Decorator)
- 外观模式(Facade)
11.享元模式(Flyweight)
二、结构型模式
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰器模式(Decorator)
- 外观模式(Facade)
6.享元模式(Flyweight) - 代理模式(Proxy)
- 责任链模式(Chain of Responsibility)
- 命令模式(Command)
- 解释器模式(Interpreter)
- 迭代器模式(Iterator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 访问者模式(Visitor)
- 对象池模式(Object Pool)
- 解释器模式(Interpreter)
- 迭代器模式(Iterator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 访问者模式(Visitor)
- 对象池模式(Object Pool)
- 解释器模式(Interpreter)
- 迭代器模式(Iterator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 访问者模式(Visitor)
以下是一些常用的设计模式及其示例代码:
- 创建型模式:单例模式(Singleton)
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
- 工厂方法模式(Factory Method)
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class AnimalFactory:
def create_animal(self, animal_type):
if animal_type == "Dog":
return Dog()
elif animal_type == "Cat":
return Cat()
else:
raise ValueError("Invalid animal type")
- 抽象工厂模式(Abstract Factory)
class AbstractFactory:
def create_product_a(self):
pass
def create_product_b(self):
pass
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ProductA1()
def create_product_b(self):
return ProductB1()
class ConcreteFactory2(AbstractFactory):
def create_product_a(self):
return ProductA2()
def create_product_b(self):
return ProductB2()
- 建造者模式(Builder)
class Product:
def __init__(self):
self.part_a = None
self.part_b = None
self.part_c = None
def set_part_a(self, part_a):
self.part_a = part_a
def set_part_b(self, part_b):
self.part_b = part_b
def set_part_c(self, part_c):
self.part_c = part_c
def show(self):
print("Part A:", self.part_a)
print("Part B:", self.part_b)
print("Part C:", self.part_c)
- 原型模式(Prototype)
class Product:
def __init__(self, name):
self.name = name
def show(self):
print("Product Name:", self.name)
class ConcreteProduct1(Product):
pass
class ConcreteProduct2(Product):
pass
- 适配器模式(Adapter)
class Target:
def request(self):
return "Target: Request"
class Adaptee:
def specific_request(self):
return "Adaptee: Specific Request"
class Adapter(Target):
def __init__(self, adaptee):
self.adaptee = adaptee
def request(self):
print("Adapter: Before")
self.adaptee.specific_request()
print("Adapter: After")
def main():
adaptee = Adaptee()
adapter = Adapter(adaptee)
print(adapter.request())
if __name__ == "__main__":
main()
- 桥接模式(Bridge)
class Abstraction:
def operation1(self):
pass
class ConcreteImplementor1(Abstraction):
def operation1(self):
return "ConcreteImplementor1: Operation1"
class ConcreteImplementor2(Abstraction):
def operation1(self):
return "ConcreteImplementor2: Operation1"
class Bridge(Abstraction):
def __init__(self, implementor1, implementor2):
self.implementor1 = implementor1
self.implementor2 = implementor2
def operation1(self):
result = self.implementor1.operation1() + " -> " + self.implementor2.operation1()
return result
- 组合模式(Composite)
class Component:
def operation(self):
pass
class ConcreteComponent1(Component):
def operation(self):
return "ConcreteComponent1"
class ConcreteComponent2(Component):
def operation(self):
return "ConcreteComponent2"
class Composite(Component):
def __init__(self):
self.components = []
def add_component(self, component):
self.components.append(component)
def remove_component(self, component):
self.components.remove(component)
def operation(self):
result = "Composite: "
for component in self.components:
result += component.operation() + ", "
return result[:-2]
- 装饰器模式(Decorator)
class Component:
def operation(self):
return "Component"
class ConcreteComponent(Component):
pass
class ConcreteDecoratorA(Component):
def __init__(self, component):
self.component = component
def operation(self):
return "ConcreteDecoratorA(" + self.component.operation() + ")"
class ConcreteDecoratorB(Component):
def __init__(self, component):
self.component = component
def operation(self):
return "ConcreteDecoratorB(" + self.component.operation() + ")"
- 外观模式(Facade)
class Component:
def operation1(self):
return "Component: Operation1"
def operation2(self):
return "Component: Operation2"
class ConcreteComponent(Component):
pass
class Facade(Component):
def __init__(self, component):
self._component = component
def operation1(self):
return self._component.operation1()
def operation2(self):
return self._component.operation2()
-享元模式(Flyweight)
class Flyweight:
_shared_state = {}
_shared_counter = {}
def __init__(self, state):
self._state = state
self._id = id(self)
if self._id not in self._shared_counter:
self._shared_counter[self._id] = 0
else:
self._shared_counter[self._id] += 1
def operation(self):
if self._shared_counter[self._id] == 0:
print("Creating new instance")
else:
print("Using existing instance")
return self._state + ": " + str(self._id) + " -> " + str(self._shared_counter[self._id]) + " times"
- 代理模式(Proxy)
class Subject:
def request(self):
return "Subject: Request"
class RealSubject(Subject):
pass
class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject
def request(self):
print("Proxy: Before")
result = self._real_subject.request()
print("Proxy: After")
return result
- 责任链模式(Chain of Responsibility)
class Handler:
def set_successor(self, successor):
self._successor = successor
def handle_request(self, request):
if self._successor is not None:
self._successor.handle_request(request)
class ConcreteHandler1(Handler):
def handle_request(self, request):
if len(request) < 10:
print("ConcreteHandler1: Handling request")
else:
self._successor.handle_request(request)
class ConcreteHandler2(Handler):
def handle_request(self, request):
if len(request) >= 10 and len(request) <= 20:
print("ConcreteHandler2: Handling request")
else:
self._successor.handle_request(request)
- 状态模式(State)
class State:
def handle(self, context):
pass
class ConcreteStateA(State):
def handle(self, context):
print("ConcreteStateA: Handling request")
context.set_state(ConcreteStateB())
class ConcreteStateB(State):
def handle(self, context):
print("ConcreteStateB: Handling request")
context.set_state(ConcreteStateC())
class Context:
def __init__(self):
self._state = ConcreteStateA()
def set_state(self, state):
self._state = state
self._state.handle(self)
- 策略模式(Strategy)
import random
class Strategy:
def execute(self, data):
pass
class ConcreteStrategyA(Strategy):
def execute(self, data):
return random.randint(1, 6) + data
class ConcreteStrategyB(Strategy):
def execute(self, data):
return random.randint(7, 12) + data
- 模板方法模式(Template Method)
class AbstractClass:
def operation1(self):
print("AbstractClass: Operation1")
def operation2(self):
print("AbstractClass: Operation2")
class ConcreteClass(AbstractClass):
def operation1(self):
super().operation1()
print("ConcreteClass: Operation1")
def operation2(self):
super().operation2()
print("ConcreteClass: Operation2")
- 访问者模式(Visitor)
class Element:
def accept(self, visitor):
pass
class ConcreteElementA(Element):
def accept(self, visitor):
visitor.visit_element_a(self)
class ConcreteElementB(Element):
def accept(self, visitor):
visitor.visit_element_b(self)
class ConcreteVisitor(Visitor):
def visit_element_a(self, element):
print("ConcreteVisitor: Visit Element A")
def visit_element_b(self, element):
print("ConcreteVisitor: Visit Element B")
- 迭代器模式(Iterator)
class Iterator:
def __init__(self, data):
self._data = data
self._index = 0
def next(self):
if self._index < len(self._data):
result = self._data[self._index]
self._index += 1
return result
else:
raise StopIteration()
- 命令模式(Command)
class Command:
def execute(self, receiver):
pass
class ConcreteCommandA(Command):
def execute(self, receiver):
print("ConcreteCommandA: Execute")
receiver.action()
class ConcreteCommandB(Command):
def execute(self, receiver):
print("ConcreteCommandB: Execute")
receiver.action()
- 解释器模式(Interpreter)
class Interpreter:
def parse(self, expression):
pass
class ConcreteInterpreter(Interpreter):
def parse(self, expression):
tokens = expression.split()
stack = []
for token in tokens:
if token == "+":
operand2 = stack.pop()
operand1 = stack.pop()
result = operand1 + operand2
stack.append(result)
elif token == "-":
operand2 = stack.pop()
operand1 = stack.pop()
result = operand1 - operand2
stack.append(result)
else:
stack.append(int(token))
return stack[0]
- 生成器模式(Generator)
class Generator:
def __init__(self, data):
self._data = data
self._index = 0
def next(self):
if self._index < len(self._data):
result = self._data[self._index]
self._index += 1
return result
else:
raise StopIteration()
- 协变返回值(Covariant Return Value)
from typing import List
class Animal:
def speak(self) -> str:
pass
class Dog(Animal):
def speak(self) -> str:
return "Woof!"
class Cat(Animal):
def speak(self) -> str:
return "Meow!"
- 组合模式(Composite)
from abc import ABC, abstractmethod
class Component(ABC):
@abstractmethod
def operation(self):
pass
class ConcreteComponentA(Component):
def operation(self):
print("ConcreteComponentA: Operation")
class ConcreteComponentB(Component):
def operation(self):
print("ConcreteComponentB: Operation")
class Composite(Component):
def __init__(self):
self._components = []
def add(self, component: Component):
self._components.append(component)
def remove(self, component: Component):
self._components.remove(component)
def operation(self):
for component in self._components:
component.operation()
- 装饰器模式(Decorator)
class Component:
def operation(self):
print("Component: Operation")
class ConcreteComponent(Component):
pass
class ConcreteDecoratorA(Component):
def __init__(self, component: Component):
self._component = component
def operation(self):
print("ConcreteDecoratorA: Operation")
self._component.operation()
class ConcreteDecoratorB(Component):
def __init__(self, component: Component):
self._component = component
def operation(self):
print("ConcreteDecoratorB: Operation")
self._component.operation()
- 代理模式(Proxy)
class Subject:
def request(self):
print("Subject: Request")
class RealSubject(Subject):
def request(self):
print("RealSubject: Request")
class Proxy(Subject):
def __init__(self, real_subject: RealSubject):
self._real_subject = real_subject
def request(self):
print("Proxy: Before Request")
self._real_subject.request()
print("Proxy: After Request")
- 状态模式(State)
class State:
def handle(self, context):
pass
class ConcreteStateA(State):
def handle(self, context):
print("ConcreteStateA: Handling request")
context.set_state(ConcreteStateB())
class ConcreteStateB(State):
def handle(self, context):
print("ConcreteStateB: Handling request")
context.set_state(ConcreteStateC())
- 策略模式(Strategy)
class Strategy:
def execute(self, data):
pass
class ConcreteStrategyA(Strategy):
def execute(self, data):
return sum(data) / len(data)
class ConcreteStrategyB(Strategy):
def execute(self, data):
return max(data)
- 模板方法模式(Template Method)
class AbstractClass:
def operation1(self):
print("AbstractClass: Operation1")
def operation2(self):
print("AbstractClass: Operation2")
class ConcreteClass(AbstractClass):
def operation1(self):
super().operation1()
print("ConcreteClass: Operation1")
def operation2(self):
super().operation2()
print("ConcreteClass: Operation2")
- 命令模式(Command)
class Command:
def execute(self, receiver):
pass
class ConcreteCommandA(Command):
def execute(self, receiver):
print("ConcreteCommandA: Execute")
receiver.action()
class ConcreteCommandB(Command):
def execute(self, receiver):
print("ConcreteCommandB: Execute")
receiver.action()
- 责任链模式(Chain of Responsibility)
class Handler:
def handle_request(self, request):
pass
class ConcreteHandler1(Handler):
def handle_request(self, request):
if request < 10:
print("ConcreteHandler1: Handling request")
return True
else:
return False
class ConcreteHandler2(Handler):
def handle_request(self, request):
if request >= 10 and request < 20:
print("ConcreteHandler2: Handling request")
return True
else:
return False
- 职责链模式(Chain of Responsibility)
class Chain:
def __init__(self):
self._handlers = []
def add_handler(self, handler):
self._handlers.append(handler)
def handle_request(self, request):
for handler in self._handlers:
if handler.handle_request(request):
break
实际问题
假设我们需要设计一个购物车系统,其中有以下几个角色:
- 商品(Product):具有名称、价格等属性。
- 购物车(Cart):具有添加商品、删除商品、计算总价等功能。
- 用户(User):具有浏览商品、将商品添加到购物车、从购物车中删除商品等功能。
我们可以使用策略模式来设计购物车的计算总价功能,具体实现如下:
from abc import ABC, abstractmethod
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
class Cart:
def __init__(self):
self._products = []
self._total_price = 0.0
def add_product(self, product):
self._products.append(product)
def remove_product(self, product):
self._products.remove(product)
@abstractmethod
def calculate_total_price(self):
pass
class ConcreteCartA(Cart):
def calculate_total_price(self):
return sum([p.price for p in self._products])
class ConcreteCartB(Cart):
def calculate_total_price(self):
return max([p.price for p in self._products])
在这个例子中,Cart
是一个抽象类,它定义了添加商品、删除商品和计算总价等基本功能,并且这些功能都是通过接口协议的方式来实现的。具体的购物车实现类可以根据不同的业务需求来选择,比如ConcreteCartA
表示按照商品单价计算总价,而ConcreteCartB
则表示按照商品单价取最大值计算总价。
工厂模式和抽象工厂模式。
- 工厂模式(Factory):工厂方法使一个类的实例化延迟到其子类。工厂方法使得在创建对象时不需要指定对象的具体类,只需要指定所需的接口即可。
- 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂方法使一个类有能力在不指定具体类的情况下创建一系列相关或依赖对象。
下面是一个使用工厂模式的例子:
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class AnimalFactory:
def create_animal(self, animal_type):
if animal_type == "Dog":
return Dog("Buddy")
elif animal_type == "Cat":
return Cat("Whiskers")
else:
raise ValueError("Invalid animal type")
在这个例子中,我们定义了一个Animal
基类以及两个继承自Animal
的子类Dog
和Cat
,它们分别具有不同的行为。然后我们定义了一个AnimalFactory
工厂类,它提供了一个create_animal
方法来根据传入的参数创建相应的动物对象。这样,当我们需要创建一个新的动物对象时,就不需要直接实例化Dog
或Cat
类了,而是调用AnimalFactory
的create_animal
方法来完成。这种方式可以避免代码重复,并且提高了代码的可扩展性和可维护性。
模板方法模式和策略模式。
- 模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
下面是一个使用模板方法模式的例子:
from abc import ABC, abstractmethod
class Operation(ABC):
@abstractmethod
def template_method(self):
pass
class ConcreteOperationA(Operation):
def template_method(self):
self.step1()
self.step2()
self.step3()
def step1(self):
print("Step 1")
def step2(self):
print("Step 2")
def step3(self):
print("Step 3")
class ConcreteOperationB(Operation):
def template_method(self):
self.step1()
self.step3()
self.step2()
def step1(self):
print("Step 1")
def step2(self):
print("Step 2")
def step3(self):
print("Step 3")
在这个例子中,我们定义了一个抽象基类Operation
,它包含了一个抽象方法template_method
。然后我们定义了两个继承自Operation
的具体子类ConcreteOperationA
和ConcreteOperationB
,它们分别实现了不同的算法流程。在这两个具体子类中,我们重写了template_method
方法来实现各自的算法流程,但是仍然保留了template_method
方法中的一些通用步骤,这样就避免了代码重复,并且提高了代码的可扩展性和可维护性。同时,如果我们需要添加新的操作类型时,只需要定义一个新的子类并实现相应的算法流程即可,而不需要修改原有的代码。
总结
这里简单总结一下前面提到的几种设计模式:
- 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
- 工厂模式(Factory):定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
- 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
- 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 原型模式(Prototype):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
- 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 桥接模式(Bridge):将抽象部分与实现部分分离,使它们都可以独立地变化。
- 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
- 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式比生成子类更为灵活。
- 外观模式(Facade):为子系统中的一组接口提供一个一致的界面。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
- 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
- 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
- 责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
- 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
- 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
- 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 备忘录模式(Memento):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
- 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。
- 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
- 模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。