设计模式第五天|代理模式 7-小明买房子 装饰模式 8-咖啡加糖

目录

【设计模式专题之代理模式】7-小明买房子

文章链接:卡码网设计模式

题目链接:7-小明买房子

这里注意在HomeAgent类里需要定义对象成员变量HomeBuyer,这里在实例化HomeAgent类时就会自动在内部实例化一个HomeBuyer类;若要定义一个指针变量HomeBuyer*,则需要写构造函数对HomeBuyer指针进行初始化,斗则在实例化HomeAgent类后,HomeBuyer会变成一个空指针,导致越界问题。

cpp 复制代码
#include<iostream>
#include<bits/stdc++.h>
 
using namespace std;
 
class HomePurchase{
public:    
    virtual void homepurchase(int area) = 0;  
};
 
class HomeBuyer : public HomePurchase{
public:
    void homepurchase(int area) override{
        cout << "YES" << endl;
    }
};
 
class HomeAgent : public HomePurchase{
private:
    HomeBuyer homebuyer;
 
public:
    //HomeAgent(HomeBuyer* homebuyer): homebuyer(homebuyer){}
     
    void homepurchase(int area) override{
        if (area > 100) homebuyer.homepurchase(area);
        else cout << "NO" << endl;
    }
};
 
int main(){
    int N;
    cin >> N;
    //HomeBuyer* buyerori = new HomeBuyer();
    HomePurchase* buyer = new HomeAgent();
    for (int i = 0; i < N; i++){
        int area;
        cin >> area;
        buyer->homepurchase(area);
    }
    delete buyer;
    //delete buyerori;
    return 0;
}

【设计模式专题装饰模式】8-咖啡加糖

文章链接:卡码网设计模式

题目链接:8-咖啡加糖

cpp 复制代码
#include <iostream>
#include <memory>

// 咖啡接口
class Coffee {
public:
    virtual ~Coffee() {}
    virtual void brew() = 0;
};

// 具体的黑咖啡类
class BlackCoffee : public Coffee {
public:
    void brew() override {
        std::cout << "Brewing Black Coffee" << std::endl;
    }
};

// 具体的拿铁类
class Latte : public Coffee {
public:
    void brew() override {
        std::cout << "Brewing Latte" << std::endl;
    }
};

// 装饰者抽象类
class Decorator : public Coffee {
protected:
    std::unique_ptr<Coffee> coffee;

public:
    Decorator(std::unique_ptr<Coffee> coffee) : coffee(std::move(coffee)) {}

    void brew() override {
        if (coffee) {
            coffee->brew();
        }
    }
};

// 具体的牛奶装饰者类
class MilkDecorator : public Decorator {
public:
    MilkDecorator(std::unique_ptr<Coffee> coffee) : Decorator(std::move(coffee)) {}

    void brew() override {
        Decorator::brew();
        std::cout << "Adding Milk" << std::endl;
    }
};

// 具体的糖装饰者类
class SugarDecorator : public Decorator {
public:
    SugarDecorator(std::unique_ptr<Coffee> coffee) : Decorator(std::move(coffee)) {}

    void brew() override {
        Decorator::brew();
        std::cout << "Adding Sugar" << std::endl;
    }
};

// 客户端代码
int main() {
    int coffeeType, condimentType;
    while (std::cin >> coffeeType >> condimentType) {
        // 根据输入制作咖啡
        std::unique_ptr<Coffee> coffee;

        if (coffeeType == 1) {
            coffee = std::make_unique<BlackCoffee>();
        } else if (coffeeType == 2) {
            coffee = std::make_unique<Latte>();
        } else {
            std::cout << "Invalid coffee type" << std::endl;
            continue;
        }

        // 根据输入添加调料
        if (condimentType == 1) {
            coffee = std::make_unique<MilkDecorator>(std::move(coffee));
        } else if (condimentType == 2) {
            coffee = std::make_unique<SugarDecorator>(std::move(coffee));
        } else {
            std::cout << "Invalid condiment type" << std::endl;
            continue;
        }

        // 输出制作过程
        coffee->brew();
    }

    return 0;
}

这是示例代码,使用了智能指针unique_ptr;在C++中,std::unique_ptr 是一种智能指针,提供了自动内存管理的能力,确保在不再需要指针时,关联的对象被正确地释放。

cpp 复制代码
std::unique_ptr<Coffee> coffee;

这行代码声明了一个名为 coffee 的智能指针(std::unique_ptr),它指向 Coffee 类型的对象。

cpp 复制代码
Decorator(std::unique_ptr<Coffee> coffee) : coffee(std::move(coffee)) {}

这是 Decorator 类的构造函数的实现。这个构造函数采用一个 std::unique_ptr 类型的参数,然后使用 std::move 将传递进来的智能指针移动到成员变量 coffee 中。

std::move(coffee) 使用 std::move 函数将传递进来的智能指针的所有权转移到 Decorator 类的成员变量 coffee。这是因为在构造函数结束后,参数 coffee 将会超出作用域,如果我们想在 Decorator 对象的生命周期内继续使用这个指针,就需要使用 std::move。

通过这种方式,Decorator 类就可以使用传递进来的 std::unique_ptr 对象,而且由于 std::unique_ptr 具有独占所有权,它还负责在 Decorator 对象生命周期结束时正确地销毁关联的 Coffee 对象。

cpp 复制代码
SugarDecorator(std::unique_ptr<Coffee> coffee) : Decorator(std::move(coffee)) {}

这是 SugarDecorator 类的构造函数的实现。构造函数采用一个 std::unique_ptr 类型的参数,然后通过 std::move 将传递进来的智能指针移动到 Decorator 类的构造函数中。

:Decorator(std::move(coffee)) 是成员初始化列表,用于调用 Decorator 类的构造函数,将 std::unique_ptr 移动到 Decorator 类的 coffee 成员变量中。

这意味着 SugarDecorator 在构造时会调用其基类 Decorator 的构造函数,将传递进来的 coffee 对象的所有权交给 Decorator。

cpp 复制代码
coffee = std::make_unique<BlackCoffee>();

这行代码使用了C++标准库中的std::make_unique函数来动态创建一个BlackCoffee对象,并将其所有权赋给名为coffee的std::unique_ptr。

cpp 复制代码
coffee = std::make_unique<MilkDecorator>(std::move(coffee));

这行代码使用 std::make_unique 创建一个新的 MilkDecorator 对象,并将先前创建的 coffee 对象的所有权通过 std::move 移动到 MilkDecorator 的构造函数中。

设计模式第五天,对智能指针的使用还不是很熟悉,操作系统看完整了,接下来先不刷设计模式了,先看排序,C++新特性和内存,然后数据库。加油!!!

相关推荐
哪 吒3 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
OkeyProxy3 小时前
什麼是ISP提供的公共IP地址?
代理模式·proxy模式·ip地址·isp·海外ip代理
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术7 小时前
23种设计模式速记法
设计模式
小白不太白9509 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式
小白不太白9509 小时前
设计模式之 原型模式
设计模式·原型模式
澄澈i9 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
kikyo哎哟喂13 小时前
Java 代理模式详解
java·开发语言·代理模式
小白不太白95016 小时前
设计模式之建造者模式
java·设计模式·建造者模式