结合网上的知识,用c++实现了specification模式

specification.h

#pragma once

template<class T>

class ISpecification

{

public:

virtual bool IsSatisfiedBy(T candidate) = 0;

virtual ISpecification<T>* And(ISpecification<T>* other) = 0;

virtual ISpecification<T>* Or(ISpecification<T>* other) = 0;

virtual ISpecification<T>* Not() = 0;

};

template<class T>

class AndSpecification;

template<class T>

class OrSpecification;

template<class T>

class NotSpecification;

template<class T>

class CompositeSpecification : public ISpecification<T>

{

public:

virtual bool IsSatisfiedBy(int candidate) = 0;

virtual ISpecification<T>* And(ISpecification<T>* other);

virtual ISpecification<T>* Or(ISpecification<T>* other);

virtual ISpecification<T>* Not();

};

template<class T>

class AndSpecification : public CompositeSpecification<T>

{

public:

AndSpecification(ISpecification<T>* x, ISpecification<T>* y);

virtual bool IsSatisfiedBy(int candidate);

private:

ISpecification<T>* m_one;

ISpecification<T>* m_other;

};

template<class T>

class OrSpecification : public CompositeSpecification<T>

{

public:

OrSpecification(ISpecification<T>* x, ISpecification<T>* y);

virtual bool IsSatisfiedBy(int candidate);

private:

ISpecification<T>* m_one;

ISpecification<T>* m_other;

};

template<class T>

class NotSpecification : public CompositeSpecification<T>

{

public:

NotSpecification(ISpecification<T>* x);

virtual bool IsSatisfiedBy(int candidate);

private:

ISpecification<T> *m_wrapped;

};

specification.cpp

// specification.cpp : 定义控制台应用程序的入口点。

//

#include "specification.h"

template<class T>

ISpecification<T>* CompositeSpecification<T>::And(ISpecification<T>* other)

{

return new AndSpecification<T>(this, other);

}

template<class T>

ISpecification<T>* CompositeSpecification<T>::Or(ISpecification<T>* other)

{

return new OrSpecification<T>(this, other);

}

template<class T>

ISpecification<T>* CompositeSpecification<T>::Not()

{

return new NotSpecification<T>(this);

}

template<class T>

AndSpecification<T>::AndSpecification(ISpecification<T>* x, ISpecification<T>* y)

{

m_one = x;

m_other = y;

}

template<class T>

bool AndSpecification<T>::IsSatisfiedBy(int candidate)

{

return m_one->IsSatisfiedBy(candidate) && m_other->IsSatisfiedBy(candidate);

}

template<class T>

OrSpecification<T>::OrSpecification(ISpecification<T>* x, ISpecification<T>* y)

{

m_one = x;

m_other = y;

}

template<class T>

bool OrSpecification<T>::IsSatisfiedBy(int candidate)

{

return m_one->IsSatisfiedBy(candidate) || m_other->IsSatisfiedBy(candidate);

}

template<class T>

NotSpecification<T>::NotSpecification(ISpecification<T>* x)

{

m_wrapped = x;

}

template<class T>

bool NotSpecification<T>::IsSatisfiedBy(int candidate)

{

return !m_wrapped->IsSatisfiedBy(candidate);

}

test.cpp

#include "stdafx.h"

#include "specification.h"

#include <vector>

#include <algorithm>

using namespace std;

class OddSpecification : public CompositeSpecification<int>

{

public:

virtual bool IsSatisfiedBy(int candidate)

{

return candidate % 2 != 0;

}

};

class PositiveSpecification : public CompositeSpecification<int>

{

public:

virtual bool IsSatisfiedBy(int candidate)

{

return candidate > 0;

}

};

int _tmain(int argc, _TCHAR* argv[])

{

vector<int> vint;

for (int i = -5; i < 10; i++)

vint.push_back(i);

ISpecification<int> *oddSpec = new OddSpecification();

ISpecification<int> *positiveSpec = new PositiveSpecification();

ISpecification<int> *oddAndPositiveSpec = oddSpec->And(positiveSpec);

for (vector<int>::iterator it = vint.begin(); it != vint.end(); ++it)

{

if (oddAndPositiveSpec->IsSatisfiedBy(*it))

//if (oddSpec->IsSatisfiedBy(*it))

printf("%d\n", *it);

}

delete oddSpec;

delete positiveSpec;

delete oddAndPositiveSpec;

return 0;

}

感觉没什么问题,但是运行时错误,提示:

>test.obj : error LNK2001: 无法解析的外部符号 "public: virtual class ISpecification<int> * __thiscall CompositeSpecification<int>::And(class ISpecification<int> *)" ([email protected][email protected]@@[email protected]@@[email protected]@Z)

1>test.obj : error LNK2001: 无法解析的外部符号 "public: virtual class ISpecification<int> * __thiscall CompositeSpecification<int>::Or(class ISpecification<int> *)" ([email protected][email protected]@@[email protected]@@[email protected]@Z)

1>test.obj : error LNK2001: 无法解析的外部符号 "public: virtual class ISpecification<int> * __thiscall CompositeSpecification<int>::Not(void)" ([email protected][email protected]@@[email protected]@@XZ)

1>D:\vsproject\pattern_sln\Debug\specification.exe : fatal error LNK1120: 3 个无法解析的外部命令

没想明白,等下次解决。

时间: 2024-12-09 20:13:39

结合网上的知识,用c++实现了specification模式的相关文章

通用Windows应用《博客园-开发者的网上家园》开发(1)——MVVM模式

最近开发了个WP8.1和Windows8.1平台上的应用——<博客园-开发者的网上家园>,基于 Windows Runtime .在此有必要说明一下,WP8.0以前的应用程序是基于Silverlight的,微软为了统一Windows Phone OS 和 Windows RT,从开发人员的角度上,也统一了两个平台上大部分的API,使得开发人员可以共享代码(而不是一次编写,跨平台运行). 本文着重描述MVVM在Windows Runtime应用程序下的表现,关于MVVM模式的理解,可参考园子里 

【Nginx-反向代理服务器】基础知识(二)之多进程模式

Nginx的多进程模式 nginx在启动后,会有一个master进程和多个worker进程.master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程.而基本的网络事件,则是放在worker进程中来处理了.多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的.一个请求,只可能在一个worker进程中处理,一个wor

完整案例分析再加知识整合——艾特简单工厂模式,超详细的

简单工厂模式 一.模式动机与定义 模式动机 只需要知道水果的名字即可得到相应的水果 模式定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法模式,它属于类创建型模式. 在简单工厂模式中,可以根据参数的不同返回不同类的实例. 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式结构与分析 模式结构 简单工厂模式包含如下角色: Factory:工厂角色 Product:抽象产品角色 ConcreteProduct:具体产品角

完整案例分析再加知识整合——艾特工厂方法模式,超详细的

工厂方法模式 模式动机与定义 模式动机 模式定义 工厂方法模式(Factory Method Pattern)简称工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式. 在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类. 模式结构与分析 模式结构 工厂

完整案例分析再加知识整合——艾特抽象工厂模式,超详细的

抽象工厂模式 模式动机与定义 模式动机 产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类. 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机.海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中. 模式定义 抽象工厂模式(Abs

前段时间一直不知道怎么学习,在网上找到一篇好文章分享给在路上的产品经理

如果你也是一枚刚入门的交互设计师,是不是常有这样一种感觉:不知从何下手,闷头读了一大堆书.学了一大堆软件.画了一大堆图之后还是感觉心里不踏实,总害怕自己还缺点什么,恨不得要有本<交互设计学习大纲>就好了.出现这个问题有两个原因,一是交互设计师没有可视性强的产物,交互设计师的产物一般是线框图.流程图.信息架构图.说明文档等等,但这些东西既不如视觉设计稿华丽精美,也不如程序代码高贵冷艳,在外行人看来初级交互设计师和高级交互设计师画的好像都差不多,轻易看不出你修炼到了几层功力;第二个原因是交互设计是

能力与知识、技能三者之间的区别与联系

作者:豆芽链接:https://www.zhihu.com/question/22475646/answer/28084200来源:知乎著作权归作者所有,转载请联系作者获得授权. 知识.技能与才干组成了能力的三核,那么我们如何才能修炼成高手? 三核中,知识最容易习得.往前追溯一百多年,知识分子的能力主要是拼记忆力,那个时候书不多且奇贵.清朝末年曾国藩买了一套<二十三史>,花了他一百两纹银,这大概是一个七品官员两年半的俸禄.现在网上<二十四史>一千三百人民币,大概是处级干部一周的工资

[.NET领域驱动设计实战系列]专题五:网上书店规约模式、工作单元模式的引入以及购物车的实现

一.前言 在前面2篇博文中,我分别介绍了规约模式和工作单元模式,有了前面2篇博文的铺垫之后,下面就具体看看如何把这两种模式引入到之前的网上书店案例里. 二.规约模式的引入 在第三专题我们已经详细介绍了什么是规约模式,没看过的朋友首先去了解下.下面让我们一起看看如何在网上书店案例中引入规约模式.在网上书店案例中规约模式的实现兼容了2种模式的实现,兼容了传统和轻量的实现,包括传统模式的实现,主要是为了实现一些共有规约的重用,不然的话可能就要重复写这些表达式.下面让我们具体看看在该项目中的实现. 首先

联系我们_站内信息_站内资讯_网上定制衬衫|衬衫定制|衬衫定做-ChenShanLe衬衫乐

联系我们_站内信息_站内资讯_网上定制衬衫|衬衫定制|衬衫定做-ChenShanLe衬衫乐 衬衫乐定制网是国内领先的成衣定制机构,专业从事衬衫网络在线定制.高级定制服装的价格不菲,而衬衫乐运用了"网上面料和款式随意搭配"的定制模式,省去常规店铺高昂的营运成本, 相比原始成衣定制业,在品质不变的的情况下价格优惠了很多.衬衫乐拥有先进的进口生产设备,多年的定制经验,精湛的工艺,国内外多家面料商直接供货的面料多样性优势,为您量身打造 一套专属于您自己的高级衬衫,让您享受贴身.舒适的着装感受,