当前位置:实例文章 » 其他实例» [文章]金九银十面试题之《设计模式》

金九银十面试题之《设计模式》

发布人:shili8 发布时间:2024-11-03 07:30 阅读次数:0

**金九银十面试题之《设计模式》**

在软件开发领域,设计模式是一套被反复使用、多数已知的、经过实践证明良好模式。这些模式已经被应用于各种类型的项目中,包括企业级应用程序、系统集成和网络应用等。在本文中,我们将讨论一些常见的设计模式及其在面试中的应用。

###1. 单例模式**定义:**

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点。

**示例代码:**

class Singleton:
 _instance = None def __new__(cls):
 if cls._instance is None:
 cls._instance = super(Singleton, cls).__new__(cls)
 return cls._instance# 使用示例obj1 = Singleton()
obj2 = Singleton()

print(obj1 is obj2) # True

**注释:**

在上面的代码中,我们定义了一个类 `Singleton`,它使用元编程来确保只有一个实例。我们通过覆盖 `__new__` 方法来实现这一点。在 `__new__` 方法中,我们检查是否已经有一个实例,如果没有,则创建一个新的实例并返回它。如果已经有一个实例,则直接返回该实例。

###2. 工厂模式**定义:**

工厂模式是一种创建型设计模式,它提供了创建对象的接口,而不需要暴露具体类的实现细节。

**示例代码:**
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")

class Dog:
 passclass Cat:
 pass# 使用示例factory = AnimalFactory()
dog = factory.create_animal("dog")
print(dog.__class__) # 

**注释:**

在上面的代码中,我们定义了一个工厂类 `AnimalFactory`,它提供了创建动物的接口。我们通过使用一个字典来实现这一点。在 `create_animal` 方法中,我们检查动物类型,如果是 "dog" 则返回一个 `Dog` 实例,如果是 "cat" 则返回一个 `Cat` 实例。如果输入的动物类型无效,则抛出一个异常。

###3. 观察者模式**定义:**

观察者模式是一种行为型设计模式,它允许对象之间建立一种一对多的依赖关系,使得当一个对象改变状态时,其他依赖于该对象的对象都会受到通知并自动更新。

**示例代码:**
class Subject:
 def __init__(self):
 self.observers = []

 def attach(self, observer):
 self.observers.append(observer)

 def detach(self, observer):
 self.observers.remove(observer)

 def notify(self, modifier=None):
 for observer in self.observers:
 if modifier != observer:
 observer.update(self)

class Observer:
 def update(self, subject):
 print(f"Received notification from {subject}")

# 使用示例subject = Subject()
observer1 = Observer()
observer2 = Observer()

subject.attach(observer1)
subject.attach(observer2)

subject.notify() # Received notification from <__main__.Subject object at0x...>

**注释:**

在上面的代码中,我们定义了一个主题类 `Subject` 和一个观察者类 `Observer`。我们通过使用一个列表来实现主题和观察者的关系。在 `attach` 方法中,我们将观察者添加到列表中,在 `detach` 方法中,我们从列表中移除观察者。在 `notify` 方法中,我们遍历列表并调用每个观察者的 `update` 方法。

###4. 策略模式**定义:**

策略模式是一种行为型设计模式,它允许在一个类中定义一系列算法或策略,并使得这些策略可以被交换和使用。

**示例代码:**
class Strategy:
 def algorithm(self, data):
 passclass ConcreteStrategyA(Strategy):
 def algorithm(self, data):
 return data *2class ConcreteStrategyB(Strategy):
 def algorithm(self, data):
 return data +1class Context:
 def __init__(self, strategy):
 self._strategy = strategy @property def strategy(self):
 return self._strategy @strategy.setter def strategy(self, strategy):
 if not isinstance(strategy, Strategy):
 raise ValueError("Invalid strategy")
 self._strategy = strategy# 使用示例context = Context(ConcreteStrategyA())
print(context.strategy.algorithm(5)) #10context.strategy = ConcreteStrategyB()
print(context.strategy.algorithm(5)) #6

**注释:**

在上面的代码中,我们定义了一个策略类 `Strategy` 和两个具体策略类 `ConcreteStrategyA` 和 `ConcreteStrategyB`。我们通过使用一个属性来实现策略的切换。在 `Context` 类中,我们有一个 `_strategy` 属性,它可以被设置为不同的策略实例。在 `algorithm` 方法中,我们调用当前策略的 `algorithm` 方法。

###5. 模板方法模式**定义:**

模板方法模式是一种行为型设计模式,它允许在一个类中定义一个算法或流程,并使得子类可以重写某些步骤,而不改变算法的结构。

**示例代码:**
class AbstractClass:
 def template_method(self):
 self.step1()
 self.step2()
 self.step3()

 def step1(self):
 print("Step1")

 def step2(self):
 print("Step2")

 def step3(self):
 print("Step3")

class ConcreteClass(AbstractClass):
 def step2(self):
 print("Concrete Step2")

# 使用示例abstract_class = AbstractClass()
print(abstract_class.template_method()) # Step1, Step2, Step3concrete_class = ConcreteClass()
print(concrete_class.template_method()) # Step1, Concrete Step2, Step3

**注释:**

在上面的代码中,我们定义了一个抽象类 `AbstractClass` 和一个具体类 `ConcreteClass`。我们通过使用一个模板方法 `template_method` 来实现算法的流程。在 `step1`、`step2` 和 `step3` 方法中,我们分别执行不同的步骤。在 `ConcreteClass` 中,我们重写了 `step2` 方法。

###6. 适配器模式**定义:**

适配器模式是一种结构型设计模式,它允许两个不兼容的接口之间建立一个适配器,从而使得它们可以一起工作。

**示例代码:**
class Target:
 def request(self):
 return "Target Request"

class Adaptee:
 def specific_request(self):
 return "Adaptee Specific Request"

class Adapter(Target, Adaptee):
 def request(self):
 return self.specific_request()

# 使用示例target = Target()
print(target.request()) # Target Requestadapter = Adapter()
print(adapter.request()) # Adaptee Specific Request

**注释:**

在上面的代码中,我们定义了一个目标类 `Target` 和一个被适配者类 `Adaptee`。我们通过使用一个适配器类 `Adapter` 来实现两个接口之间的适配。在 `Adapter` 类中,我们重写了 `request` 方法,使得它可以调用 `specific_request` 方法。

###7. 装饰器模式**定义:**

装饰器模式是一种结构型设计模式,它允许在不改变原有类的基础上,动态地添加新的行为或功能。

**示例代码:**
def decorator(func):
 def wrapper(*args, **kwargs):
 print("Before calling the function")
 func(*args, **kwargs)
 print("After calling the function")
 return wrapper@decoratordef add(a, b):
 return a + bprint(add(2,3)) # Before calling the function,5, After calling the function

**注释:**

在上面的代码中,我们定义了一个装饰器函数 `decorator` 和一个被装饰的函数 `add`。我们通过使用装饰器语法来实现装饰器的应用。在 `decorator` 函数中,我们定义了一个新函数 `wrapper`,它可以包裹原有的函数 `add`。

###8. 外观模式**定义:**

外观模式是一种结构型设计模式,它允许在不暴露内部实现细节的情况下,提供一个统一的接口来访问多个子系统。

**示例代码:**
class Subsystem1:
 def operation1(self):
 return "Subsystem1: Ready!"

class Subsystem2:
 def operation2(self):
 return "Subsystem2:

相关标签:设计模式
其他信息

其他资源

Top