不改变类代码的情况下扩展该类功能?
先上图
目前应用采用的是yaf
框架,所有的控制器都继承
自Base_controller
, 但由于后期功能越来越多(权限管理、产品管理、日志管理等), 导致Base_controller
已经不能再臃肿了,
当然完全可以按不同的功能新建不同的类文件,然后在Base_controller
中初始化也能满足需求, 但这样各个功能和Base_controller
强耦合, 所以我想有没有更好的解决方案。
目前我想的是装饰模式
,(因为目前只会这个,妈蛋),
用具体的装饰类(权限管理,日志管理)来装饰Base_controller
, 使其具有这些功能, 但由于装饰模式要求被装饰者(Base_controller
), 和具体装饰者都继承自同一类, 然而现在Base_controller
已经继承自其它类了, 所以Base_controller
不能充当被装饰者的角色,
那么我辛辛苦苦写好的功能类(权限管理、产品管理、日志管理)用来装饰谁呢,
所以是不是我方向错了, 装饰模式在这里根本就不合适, 还是说需要其他的设计?
回复内容:
先上图
目前应用采用的是yaf
框架,所有的控制器都继承
自Base_controller
, 但由于后期功能越来越多(权限管理、产品管理、日志管理等), 导致Base_controller
已经不能再臃肿了,
当然完全可以按不同的功能新建不同的类文件,然后在Base_controller
中初始化也能满足需求, 但这样各个功能和Base_controller
强耦合, 所以我想有没有更好的解决方案。
目前我想的是装饰模式
,(因为目前只会这个,妈蛋),
用具体的装饰类(权限管理,日志管理)来装饰Base_controller
, 使其具有这些功能, 但由于装饰模式要求被装饰者(Base_controller
), 和具体装饰者都继承自同一类, 然而现在Base_controller
已经继承自其它类了, 所以Base_controller
不能充当被装饰者的角色,
那么我辛辛苦苦写好的功能类(权限管理、产品管理、日志管理)用来装饰谁呢,
所以是不是我方向错了, 装饰模式在这里根本就不合适, 还是说需要其他的设计?
使用php的trait
谢邀。
楼上说的 Trait 确实是一个方案,不过问题的关键可能不在这里。
你对装饰模式的理解虽然不准确但是问题不大,也不是关键
我在实际开发中从未遇到过BaseController被搞得很臃肿的问题,通常这是开发人员的水平(或者说境界)导致的结果,别说不改变类代码,就算改变类代码这个问题也解决不了,而是要重构。
通常BaseController臃肿是因为很多不应该由Controller提供的方法被声明导致的,这些方法可能应该在Model中声明,或者属于Helper,这才是关键的问题。Model是共用的,所以其方法在任何Controller中都能使用。而如果本应Model定义的方法被放到了Controller中,而Controller不是公用的,此时的最简单的解决方式就是放到Base里面了,长期累积下来就是你现在看到的结果。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

CakePHP ialah rangka kerja MVC sumber terbuka. Ia menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP mempunyai beberapa perpustakaan untuk mengurangkan beban tugas yang paling biasa.

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data
