ホームページ バックエンド開発 PHPチュートリアル php设计模式 Template (模板模式)_php技巧

php设计模式 Template (模板模式)_php技巧

May 17, 2016 am 09:17 AM
PHPのデザインパターン template テンプレートモード

继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子。“使用委派关系代替继承关系”,“尽量使用接口实现而不是抽象类继承”等等专家警告,让我们这些菜鸟对继承“另眼相看”。其实,继承还是有很多自身的优点所在。只是被大家滥用的似乎缺点更加明显了。合理的利用继承关系,还是能对你的系统设计起到很好的作用的。而模板方法模式就是其中的一个使用范例。

GOF给模板方法(Template Method)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。

可以看出来,模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。使用模板方法使系统扩展性增强,最小化了变化对系统的影响。这一点,在下面的举例中可以很明显的看出来。

复制代码 代码如下:

/**
* 模板模式
*
* 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤
*
*/
abstract class TemplateBase
{
public function Method1()
{
echo "abstract Method1
";
}

public function Method2()
{
echo "abstract Method2
";
}

public function Method3()
{
echo "abstract Method3
";
}

public function doSomeThing()
{
$this->Method1();
$this->Method2();
$this->Method3();
}
}

class TemplateObject extends TemplateBase
{
}

class TemplateObject1 extends TemplateBase
{
public function Method3()
{
echo "TemplateObject1 Method3
";
}
}

class TemplateObject2 extends TemplateBase
{
public function Method2()
{
echo "TemplateObject2 Method2
";
}
}

// 实例化
$objTemplate = new TemplateObject();
$objTemplate1 = new TemplateObject1();
$objTemplate2 = new TemplateObject2();

$objTemplate->doSomeThing();
$objTemplate1->doSomeThing();
$objTemplate2->doSomeThing();

AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。

ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。

根据上面对定义的分析,以及例子的说明,可以看出模板方法适用于以下情况:

一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了。
控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。比如上面runBare()方法就只在runTest前面适用setUp方法。如果你不愿子类来修改你的模板方法定义的框架,你可以采用两种方式来做:一是在API中不体现出你的模板方法;二、将你的模板方法置为final就可以了。
可以看出,使用模板方法模式可以将代码的公共行为提取出来,达到复用的目的。而且,在模板方法模式中,是由父类的模板方法来控制子类中的具体实现。这样你在实现子类的时候,根本不需要对业务流程有太多的了解。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang と Template パッケージ: パーソナライズされたユーザー インターフェイスの作成 Golang と Template パッケージ: パーソナライズされたユーザー インターフェイスの作成 Jul 18, 2023 am 10:27 AM

Golang とテンプレート パッケージ: パーソナライズされたユーザー インターフェイスを作成する 最新のソフトウェア開発では、ユーザー インターフェイスは多くの場合、ユーザーがソフトウェアと対話するための最も直接的な方法です。使いやすく美しいユーザー インターフェイスを提供するために、開発者はユーザー インターフェイスを作成およびカスタマイズするための柔軟なツールを必要とします。 Golang では、開発者は Template パッケージを使用してこの目標を達成できます。この記事では、Golang および Template パッケージの基本的な使用法を紹介し、コード例を通じてパーソナライズされたユーザー インターフェイスを作成する方法を示します。

golangの「unknown: template.Must」エラーを解決するにはどうすればよいですか? golangの「unknown: template.Must」エラーを解決するにはどうすればよいですか? Jun 24, 2023 pm 09:00 PM

Go 言語は、簡潔な構文、効率的なパフォーマンス、簡単な開発により、ますます人気が高まっているプログラミング言語です。 Go言語には「text/template」という強力なテンプレートエンジンが用意されていますが、これを使用すると「unknown:template.Must」というエラーが発生する場合がありますので、このエラーを解決する方法を以下に示します。正しいパッケージをインポートしてください。「text/template」テンプレート エンジンを使用する場合は、「text/template」をインポートする必要があります

Golang のテンプレート パッケージによるデータ視覚化 Golang のテンプレート パッケージによるデータ視覚化 Jul 17, 2023 am 09:01 AM

Golang のテンプレート パッケージによるデータの視覚化 ビッグ データ時代の到来により、データの視覚化は情報処理と分析の重要な手段の 1 つになりました。データの視覚化により、データを簡潔かつ直感的な方法で表示できるため、人々がデータをよりよく理解して分析できるようになります。 Golang では、Template パッケージを使用してデータ視覚化機能を実装できます。この記事では、Golang の Template パッケージを使用してデータ視覚化を実現する方法を紹介し、コード例を示します。ゴランテム

RedisTemplateのopsForValueの使い方 RedisTemplateのopsForValueの使い方 Jun 03, 2023 am 08:55 AM

Redis 1 での opsForValue() メソッドの使用。 set(Kkey, Vvalue) は文字列型の値を追加します。key はキー、value は値です。 redisTemplate.opsForValue().set("stringValue","bbb"); 2. get(Objectkey) は、キー key に対応する値を取得します。 StringstringValue=redisTemplate.opsForValue().get("key")3.append(Kkey,St

Golang と Template パッケージ: 強力なフロントエンド開発ツールボックスの構築 Golang と Template パッケージ: 強力なフロントエンド開発ツールボックスの構築 Jul 19, 2023 pm 02:43 PM

Golang と Template パッケージ: 強力なフロントエンド開発ツールボックスの構築 今日のソフトウェア開発では、プロジェクト全体を通じてフロントエンド開発の重要性がますます高まっています。エレガントで信頼性の高いフロントエンド開発ソリューションを提供するために、Golang 言語とその組み込みテンプレート パッケージを使用できます。この記事では、Golang と Template パッケージを使用して強力なフロントエンド開発ツールボックスを構築する方法を紹介します。 1. Golang: 効率的で使いやすいプログラミング言語 Golang は現代的な言語です。

Golang とテンプレート パッケージ: 便利なフロントエンド インターフェイスを迅速に開発 Golang とテンプレート パッケージ: 便利なフロントエンド インターフェイスを迅速に開発 Jul 17, 2023 pm 08:57 PM

Golang とテンプレート パッケージ: 便利なフロントエンド インターフェイスを迅速に開発する 現代の Web 開発において、フロントエンド インターフェイスの開発は重要かつ不可欠なリンクです。フロントエンド インターフェイスのデザインは美しいだけでなく、優れたユーザー エクスペリエンスも必要です。ただし、従来のフロントエンド開発プロセスでは多くの時間と労力が必要です。幸いなことに、Golang には、開発者が便利なフロントエンド インターフェイスを迅速に構築できるように設計された Template パッケージが用意されています。 Golang は効率的、簡潔、同時実行型、静的に型付けされた言語です。

PHPでよく使われるデザインパターンとその実装方法 PHPでよく使われるデザインパターンとその実装方法 Jun 27, 2023 pm 01:08 PM

PHP は広く使用されており、非常に人気のあるプログラミング言語です。 PHP は、今日の Web アプリケーションの非常に重要な部分です。デザイン パターンは、PHP アプリケーションの開発において重要な役割を果たします。デザイン パターンは、さまざまな環境で再利用できる問題を解決するためのテンプレートであり、より良いコードを作成し、コードの信頼性、保守性、拡張性を高めるのに役立ちます。この記事では、PHP で一般的に使用されるデザイン パターンとその実装方法について説明します。シングルトン パターン シングルトン パターンは、次のことを可能にする作成パターンです。

SpringBoot が RedisTemplate を使用して Redis データ型を操作する方法 SpringBoot が RedisTemplate を使用して Redis データ型を操作する方法 Jun 04, 2023 am 09:43 AM

Spring は、すべての Redis ネイティブ API をサポートする Redis を操作するために RedisTemplate をカプセル化します。 RedisTemplateには5つのデータ構造の操作メソッドが定義されています。 opsForValue(): 文字列を操作します。 opsForList(): 操作リスト。 opsForHash(): ハッシュを操作します。 opsForSet(): 操作セット。 opsForZSet(): 順序付きセットを操作します。これらの方法を理解して適用するための例を以下に示します。ここで特別な注意が必要なのは、上記のメソッドを実行した後にデータをクリアする必要があることです。そうしないと、メソッドを複数回実行すると、データ操作が繰り返されることになります。 (1) Mavenを使用して依存関係ファイルを追加する

See all articles