设计模式学习(一)——《大话设计模式》
1.类与实例(OOP-Object-Oriented Programming)
类(Class):具有相同的属性和功能的对象的集合;实例是一个真实的对象。可以将类比作是一个制造对象的模具,它定义了创建特定类型对象时所需的结构和行为。
- 属性(Attributes):类中定义的变量。它们代表了对象的状态或特性。
- 方法(Methods):类中定义的函数。它们代表了对象可以执行的操作。
实例(Instance):实例是根据类的定义创建的具体对象。每个实例都拥有类中定义的属性和方法,但各自的属性值可以不同,这意味着每个实例都是独特的。
当创建一个类的实例时,实际上是在根据类的蓝图创建一个具体的对象。这个过程通常被称为“实例化”。
代码示例(参考):
#假设我们有一个名为Dog的类,它代表了狗这一类动物的共同特征和行为。
class Dog:
def __init__(self, name, breed):
self.name = name # 属性:名字
self.breed = breed # 属性:品种
def bark(self): # 方法:叫
return f"{self.name} says woof!"
Dog类有两个属性(name和breed)和一个方法(bark)。我们可以根据这个类创建实例:
my_dog = Dog("Buddy", "Golden Retriever")
print(my_dog.bark()) # 输出: Buddy says woof!
my_dog是一个Dog类的实例,具有名为“Buddy”的名字属性和“Golden Retriever”作为品种属性。每次我们根据Dog类创建一个新的实例时,我们都可以为它指定不同的名字和品种,每个实例都会拥有相同的方法(在这个例子中是bark),但是属性值(如名字和品种)可以根据每个实例而不同。
2.构造方法
构造方法,又叫构造函数,其实就是对类进行初始化。构造方法(或构造函数)是一种特殊的方法,它在创建类的新实例时自动调用。构造方法的主要作用是初始化新创建的对象,为新创建的对象设置初始状态。
特点
自动调用:当创建类的实例时,无需明确调用构造方法,它会自动执行。
初始化对象:构造方法通常用于初始化对象的属性或执行必要的启动步骤。
名称特定:在某些语言中,构造方法有固定的名称(如Python中的__init__),而在其他语言中,构造方法的名称可能与类名相同(如Java和C++)。
代码示例:
class Dog:
def __init__(self, name, breed):
self.name = name # 初始化属性name
self.breed = breed # 初始化属性breed
class Dog {
public:
string name;
string breed;
Dog(string name, string breed) {
this->name = name; // 初始化属性name
this->breed = breed; // 初始化属性breed
}
};
public class Dog {
String name;
String breed;
public Dog(String name, String breed) {
this.name = name; // 初始化属性name
this.breed = breed; // 初始化属性breed
}
}
注意事项:
- 构造方法可以有参数,这允许在创建对象时传递初始值。
- 某些语言支持构造方法的重载,这意味着可以根据不同的参数定义多个构造方法。
- 在一些语言中,如果没有明确定义构造方法,编译器会提供一个默认的构造方法(不接受任何参数并且不执行任何操作)。
3.方法重载
方法重载提供了创建同名的多个方法的能力,但这些方法需要使用不同的参数类型。参数列表的不同可以是参数的数量不同、参数类型不同或者参数的顺序不同。
方法重载的关键点
- 参数列表必须不同:这是方法重载的核心。只有当参数的数量、类型或者顺序至少有一项不同时,才能构成重载。
- 返回类型可以不同:虽然方法重载允许返回类型不同,但仅通过返回类型的不同并不能构成重载。
- 访问修饰符可以不同:方法重载的方法可以有不同的访问修饰符(如public、protected等)。
- 抛出的异常可以不同:重载的方法可以声明抛出不同的异常。
代码示例:
public class Dog {
String name;
String breed;
public Dog(String name, String breed) {
this.name = name; // 初始化属性name
this.breed = breed; // 初始化属性breed
}
}
#使用可变参数模拟方法重载
def add(*args):
if len(args) == 2 and all(isinstance(x, int) for x in args):
return args[0] + args[1]
elif len(args) == 3 and all(isinstance(x, int) for x in args):
return args[0] + args[1] + args[2]
elif len(args) == 2 and all(isinstance(x, float) for x in args):
return args[0] + args[1]
else:
return "Unsupported operation"
# 使用
print(add(1, 2)) # 输出: 3
print(add(1, 2, 3)) # 输出: 6
print(add(1.5, 2.5)) # 输出: 4.0
print(add("a", "b")) # 输出: Unsupported operation
#使用关键字参数和默认值模拟
def add(a=None, b=None, c=None):
if isinstance(a, int) and isinstance(b, int) and c is None:
return a + b
elif isinstance(a, int) and isinstance(b, int) and isinstance(c, int):
return a + b + c
elif isinstance(a, float) and isinstance(b, float) and c is None:
return a + b
else:
return "Unsupported operation"
# 使用
print(add(a=1, b=2)) # 输出: 3
print(add(a=1, b=2, c=3)) # 输出: 6
print(add(a=1.5, b=2.5)) # 输出: 4.0