Php 复合模式,为什么不好,如果;“儿童”;“了解”;家长;?
代码示例:我做了一些类似的东西,除了“Php 复合模式,为什么不好,如果;“儿童”;“了解”;家长;?,php,composition,Php,Composition,代码示例:我做了一些类似的东西,除了“电子书架上的””知道$books(几本书)。我的“老板”说他们互相了解很糟糕。但是为什么呢 好吧,我编辑它: abstract class OnTheBookShelf { public $shelf; ///////////////////////////////////////////////// abstract function getBookInfo($previousBook); abstract function get
电子书架上的”
”知道$books(几本书
)。我的“老板”说他们互相了解很糟糕。但是为什么呢
好吧,我编辑它:
abstract class OnTheBookShelf {
public $shelf; /////////////////////////////////////////////////
abstract function getBookInfo($previousBook);
abstract function getBookCount();
abstract function setBookCount($new_count);
abstract function addBook($oneBook);
abstract function removeBook($oneBook);
}
class OneBook extends OnTheBookShelf {
private $title;
private $author;
function __construct($title, $author) {
$this->title = $title;
$this->author = $author;
}
function getBookInfo($bookToGet) {
if (1 == $bookToGet) {
return $this->title." by ".$this->author;
} else {
return FALSE;
}
}
function getBookCount() {
return 1;
}
function setBookCount($newCount) {
return FALSE;
}
function addBook($oneBook) {
return FALSE;
}
function removeBook($oneBook) {
return FALSE;
}
}
class SeveralBooks extends OnTheBookShelf {
private $oneBooks = array();
private $bookCount;
public function __construct() {
$this->setBookCount(0);
}
public function getBookCount() {
return $this->bookCount;
}
public function setBookCount($newCount) {
$this->bookCount = $newCount;
}
public function getBookInfo($bookToGet) {
if ($bookToGet <= $this->bookCount) {
return $this->oneBooks[$bookToGet]->getBookInfo(1);
} else {
return FALSE;
}
}
public function addBook($oneBook) {
$oneBook->shelf = $this; //////////////////////////////////////////////////
$this->setBookCount($this->getBookCount() + 1);
$this->oneBooks[$this->getBookCount()] = $oneBook;
return $this->getBookCount();
}
public function removeBook($oneBook) {
$counter = 0;
while (++$counter <= $this->getBookCount()) {
if ($oneBook->getBookInfo(1) ==
$this->oneBooks[$counter]->getBookInfo(1)) {
for ($x = $counter; $x < $this->getBookCount(); $x++) {
$this->oneBooks[$x] = $this->oneBooks[$x + 1];
}
$this->setBookCount($this->getBookCount() - 1);
}
}
return $this->getBookCount();
}
}
电子书架上的抽象类{
公共货架/////////////////////////////////////////////////
抽象函数getBookInfo($previousBook);
抽象函数getBookCount();
抽象函数setBookCount($new_count);
抽象函数addBook($oneBook);
抽象函数removeBook($oneBook);
}
第一类图书扩展到电子书架上{
私人产权;
私人作家;
函数构造($title,$author){
$this->title=$title;
$this->author=$author;
}
函数getBookInfo($bookToGet){
如果(1==$bookToGet){
返回$this->title.“..$this->author;
}否则{
返回FALSE;
}
}
函数getBookCount(){
返回1;
}
函数setBookCount($newCount){
返回FALSE;
}
函数addBook($oneBook){
返回FALSE;
}
函数removeBook($oneBook){
返回FALSE;
}
}
类扩展到电子书架上{
private$oneBooks=array();
私人$bookCount;
公共函数构造(){
$this->setBookCount(0);
}
公共函数getBookCount(){
返回$this->bookCount;
}
公共功能setBookCount($newCount){
$this->bookCount=$newCount;
}
公共函数getBookInfo($bookToGet){
如果($bookToGet bookCount){
返回$this->oneBooks[$bookToGet]->getBookInfo(1);
}否则{
返回FALSE;
}
}
公共函数addBook($oneBook){
$oneBook->shelf=$this//////////////////////////////////////////////////
$this->setBookCount($this->getBookCount()+1);
$this->oneBooks[$this->getBookCount()]=$oneBook;
返回$this->getBookCount();
}
公共功能removeBook($oneBook){
$counter=0;
而(++$counter getBookCount()){
如果($oneBook->getBookInfo(1)=
$this->oneBooks[$counter]->getBookInfo(1)){
对于($x=$counter;$x<$this->getBookCount();$x++){
$this->oneBooks[$x]=$this->oneBooks[$x+1];
}
$this->setBookCount($this->getBookCount()-1);
}
}
返回$this->getBookCount();
}
}
我在有问题的行中添加了一堆。在这里,他们说这本书提到了书架。他们应该知道自己的接口,以便可以更改它们 假设你有课程:
Bookshelf
private books: Book[]
Book
public title: String
然后您将访问图书[i]。书名并显示图书的书名
现在想象一下,负责书籍的程序员决定书名是merrits自己的类,因此我们有:
Book
public title: Title
Title
private t: String
public toString()
现在,编写书架代码的程序员需要更改他们的代码
另一方面,如果我们能够:
Book
private title: String
public getTitleString()
然后我们可以更改Book
类的实现,我们所要做的就是编写getTitleString()
函数,该函数将返回标题的字符串表示形式,并且一切都将继续工作,而不会对书架
进行任何额外的更改
我的“老板”说他们互相了解很糟糕。但是为什么呢
问题是书架
和书籍
之间的循环引用不是那么简单,需要特别小心处理
例如,如果您只需编写$oneBook->shelf=$this
insideaddBook
方法,那么如果消费者对两个不同书架上的一本书调用此方法,会发生什么情况
$book = new Book;
$shelf1 = new Shelf;
$shelf2 = new Shelf;
$shelf1->addBook($book);
$shelf2->addBook($book);
Book
将被添加到两个书架上,但它只会引用最后一个书架,这会导致不一致和潜在的运行时错误
当然,循环引用是正确的,但它需要特别注意,并增加了代码的复杂性。请给出一些具体的例子。在复合模式中,通常不存在任何“父/子”关系;这与类继承有关。在您的案例中,Book是否扩展了书架
,而Bookshelf
是由书籍
组成的,还是。。。?