桥接模式 提供大中小
时间: 2024-02-10 22:06:43 浏览: 68
桥接模式是一种结构型设计模式,它可以将一个大类或者一组紧密相关的类拆分成抽象和实现两个独立的层次结构,从而能够在开发过程中更加灵活地组合和扩展不同的抽象和实现。
具体来说,桥接模式包含以下几个要素:
1. 抽象类(Abstraction):定义了抽象部分的接口,通常包含一个指向实现类的引用。
2. 实现类接口(Implementor):定义了实现部分的接口,通常只提供基本操作,而抽象类则定义了基于这些基本操作的较高层次的操作。
3. 具体实现类(Concrete Implementor):实现了实现类接口,并且通过这些基本操作完成了抽象类定义的高层次操作。
4. 桥接(Bridge):将抽象部分与实现部分连接起来,并且在抽象部分中保存一个指向实现部分的引用。
桥接模式可以帮助我们将一个大类或者一组紧密相关的类拆分成抽象和实现两个独立的层次结构,从而能够更加灵活地组合和扩展不同的抽象和实现。同时,桥接模式还可以帮助我们隐藏实现细节,从而提高系统的安全性和稳定性。
在实际应用中,桥接模式可以应用于很多场景,例如操作系统的窗口管理器、图形界面工具包、数据库驱动程序等等。
相关问题
使用装饰器模式和桥接模式实现大中小尺寸的咖啡和调料尺寸的功能
首先,我们需要定义咖啡和调料的抽象类:
```python
from abc import ABC, abstractmethod
class Beverage(ABC):
@abstractmethod
def cost(self):
pass
@abstractmethod
def get_description(self):
pass
class CondimentDecorator(Beverage):
@abstractmethod
def cost(self):
pass
@abstractmethod
def get_description(self):
pass
```
接下来,我们定义具体的咖啡类:
```python
class Espresso(Beverage):
def cost(self):
return 1.99
def get_description(self):
return "Espresso"
```
```python
class DarkRoast(Beverage):
def cost(self):
return 0.99
def get_description(self):
return "Dark Roast Coffee"
```
```python
class Decaf(Beverage):
def cost(self):
return 1.05
def get_description(self):
return "Decaf Coffee"
```
然后,我们定义具体的调料类:
```python
class Milk(CondimentDecorator):
def __init__(self, beverage):
self.beverage = beverage
def cost(self):
return self.beverage.cost() + 0.10
def get_description(self):
return self.beverage.get_description() + ", Milk"
```
```python
class Mocha(CondimentDecorator):
def __init__(self, beverage):
self.beverage = beverage
def cost(self):
return self.beverage.cost() + 0.20
def get_description(self):
return self.beverage.get_description() + ", Mocha"
```
```python
class Soy(CondimentDecorator):
def __init__(self, beverage):
self.beverage = beverage
def cost(self):
return self.beverage.cost() + 0.15
def get_description(self):
return self.beverage.get_description() + ", Soy"
```
最后,我们可以使用装饰器模式和桥接模式来实现大中小尺寸的咖啡和调料尺寸的功能:
```python
class Size:
def cost(self):
pass
def get_description(self):
pass
class Small(Size):
def __init__(self, beverage):
self.beverage = beverage
def cost(self):
return self.beverage.cost() - 0.10
def get_description(self):
return self.beverage.get_description() + ", Small"
class Medium(Size):
def __init__(self, beverage):
self.beverage = beverage
def cost(self):
return self.beverage.cost()
def get_description(self):
return self.beverage.get_description() + ", Medium"
class Large(Size):
def __init__(self, beverage):
self.beverage = beverage
def cost(self):
return self.beverage.cost() + 0.10
def get_description(self):
return self.beverage.get_description() + ", Large"
beverage = Espresso()
beverage = Milk(beverage)
beverage = Mocha(beverage)
beverage = Large(beverage)
print(beverage.get_description(), "$" + str(beverage.cost()))
```
输出结果为:
```
Espresso, Milk, Mocha, Large $2.39
```
这里我们定义了一个 `Size` 基类和三个子类 `Small`、`Medium`、`Large`,用于实现不同尺寸的咖啡。在具体的咖啡和调料类中,我们使用了桥接模式,将 `Beverage` 和 `CondimentDecorator` 作为参数传递给具体的调料类,实现了装饰器模式。最后,在客户端代码中,我们可以通过组合不同的咖啡和调料对象,来实现各种不同口味和尺寸的咖啡,并且可以根据需要随时添加或删除调料对象,非常灵活方便。
java使用装饰器模式和桥接模式实现大中小尺寸的咖啡和调料尺寸的功能
装饰器模式和桥接模式可以很好地实现大中小尺寸的咖啡和调料尺寸的功能。
首先,我们需要定义一个基础的咖啡类,它有一个getSize()方法,返回咖啡的大小(大、中、小)。
```java
public abstract class Coffee {
protected String description = "Unknown coffee";
public String getDescription() {
return description;
}
public abstract double cost();
public abstract String getSize();
}
```
然后,我们定义三个具体的咖啡类,分别是SmallCoffee、MediumCoffee和LargeCoffee,它们分别实现getSize()方法,返回不同的咖啡大小。
```java
public class SmallCoffee extends Coffee {
public SmallCoffee() {
description = "Small Coffee";
}
public double cost() {
return 2.5;
}
public String getSize() {
return "Small";
}
}
public class MediumCoffee extends Coffee {
public MediumCoffee() {
description = "Medium Coffee";
}
public double cost() {
return 3.5;
}
public String getSize() {
return "Medium";
}
}
public class LargeCoffee extends Coffee {
public LargeCoffee() {
description = "Large Coffee";
}
public double cost() {
return 4.5;
}
public String getSize() {
return "Large";
}
}
```
接下来,我们使用装饰器模式为咖啡添加调料。我们定义一个CondimentDecorator抽象类,它继承自Coffee类,并包含一个protected成员变量,即被装饰的咖啡对象。在CondimentDecorator中,我们重写getDescription()方法,将被装饰的咖啡的描述和调料的描述拼接起来。
```java
public abstract class CondimentDecorator extends Coffee {
protected Coffee coffee;
public abstract String getDescription();
}
```
然后,我们定义三个具体的调料类,分别是Milk、Sugar和Whip,它们继承自CondimentDecorator类。在这些具体的调料类中,我们实现getDescription()方法,将被装饰的咖啡的描述和调料的描述拼接起来,并实现cost()方法,返回咖啡的价格加上调料的价格。
```java
public class Milk extends CondimentDecorator {
public Milk(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Milk";
}
public double cost() {
return coffee.cost() + 0.5;
}
public String getSize() {
return coffee.getSize();
}
}
public class Sugar extends CondimentDecorator {
public Sugar(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Sugar";
}
public double cost() {
return coffee.cost() + 0.3;
}
public String getSize() {
return coffee.getSize();
}
}
public class Whip extends CondimentDecorator {
public Whip(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Whip";
}
public double cost() {
return coffee.cost() + 0.7;
}
public String getSize() {
return coffee.getSize();
}
}
```
最后,我们使用桥接模式将咖啡的大小和调料的尺寸分离开来。我们定义一个Size接口,其中包含一个getSize()方法,返回咖啡的大小(大、中、小)。然后,在Coffee类中包含一个Size成员变量,并实现getSize()方法,返回这个Size对象的getSize()方法的返回值。这样,我们就可以在咖啡的装饰器中引用这个Size对象,从而实现咖啡大小和调料尺寸的组合。
```java
public interface Size {
public String getSize();
}
public class SmallSize implements Size {
public String getSize() {
return "Small";
}
}
public class MediumSize implements Size {
public String getSize() {
return "Medium";
}
}
public class LargeSize implements Size {
public String getSize() {
return "Large";
}
}
public abstract class Coffee {
protected String description = "Unknown coffee";
protected Size size;
public String getDescription() {
return description;
}
public abstract double cost();
public String getSize() {
return size.getSize();
}
public void setSize(Size size) {
this.size = size;
}
}
public class SmallCoffee extends Coffee {
public SmallCoffee() {
description = "Small Coffee";
size = new SmallSize();
}
public double cost() {
return 2.5;
}
}
public class MediumCoffee extends Coffee {
public MediumCoffee() {
description = "Medium Coffee";
size = new MediumSize();
}
public double cost() {
return 3.5;
}
}
public class LargeCoffee extends Coffee {
public LargeCoffee() {
description = "Large Coffee";
size = new LargeSize();
}
public double cost() {
return 4.5;
}
}
public abstract class CondimentDecorator extends Coffee {
protected Coffee coffee;
public abstract String getDescription();
}
public class Milk extends CondimentDecorator {
public Milk(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Milk";
}
public double cost() {
double cost = coffee.cost();
if (coffee.getSize().equals("Small")) {
cost += 0.3;
} else if (coffee.getSize().equals("Medium")) {
cost += 0.5;
} else if (coffee.getSize().equals("Large")) {
cost += 0.7;
}
return cost;
}
}
public class Sugar extends CondimentDecorator {
public Sugar(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Sugar";
}
public double cost() {
double cost = coffee.cost();
if (coffee.getSize().equals("Small")) {
cost += 0.2;
} else if (coffee.getSize().equals("Medium")) {
cost += 0.3;
} else if (coffee.getSize().equals("Large")) {
cost += 0.4;
}
return cost;
}
}
public class Whip extends CondimentDecorator {
public Whip(Coffee coffee) {
this.coffee = coffee;
}
public String getDescription() {
return coffee.getDescription() + ", Whip";
}
public double cost() {
double cost = coffee.cost();
if (coffee.getSize().equals("Small")) {
cost += 0.4;
} else if (coffee.getSize().equals("Medium")) {
cost += 0.6;
} else if (coffee.getSize().equals("Large")) {
cost += 0.8;
}
return cost;
}
}
```
这样,我们就可以通过组合咖啡和调料的方式实现不同尺寸的咖啡和调料尺寸的功能了。例如,下面的代码创建了一个小杯加牛奶和糖的咖啡,并输出了它的描述和价格。
```java
Coffee coffee = new SmallCoffee();
coffee = new Milk(coffee);
coffee = new Sugar(coffee);
System.out.println(coffee.getDescription() + " $" + coffee.cost());
```
阅读全文